Mina TCP服务端客户端 示例
服务端代码:
- package com.xd.nms.example;
- import java.io.IOException;
- import java.net.InetSocketAddress;
- import org.apache.mina.core.buffer.IoBuffer;
- import org.apache.mina.core.service.IoHandlerAdapter;
- import org.apache.mina.core.session.IdleStatus;
- import org.apache.mina.core.session.IoSession;
- import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
- import com.xd.nms.util.ByteAndStr16;
- /**
- * @说明 Mina TCP 服务端
- * @author 崔素强
- * @version 1.0
- * @since
- */
- public class MinaTcpServer extends IoHandlerAdapter {
- public static final int PORT = 18567;
- public MinaTcpServer() throws IOException {
- NioSocketAcceptor acceptor = new NioSocketAcceptor();
- acceptor.setHandler(this);
- acceptor.bind(new InetSocketAddress(PORT));
- System.out.println("TCP服务启动,端口:" + PORT);
- }
- public static void main(String[] args) throws IOException {
- new MinaTcpServer();
- }
- @Override
- public void messageReceived(IoSession session, Object message)
- throws Exception {
- IoBuffer bbuf = (IoBuffer) message;
- byte[] byten = new byte[bbuf.limit()];
- bbuf.get(byten, bbuf.position(), bbuf.limit());
- System.out.println("收到消息:" + ByteAndStr16.Bytes2HexString(byten));
- byte[] bts = new byte[10];
- for(int i=0;i<10;i++){
- bts[i] = (byte)i;
- }
- IoBuffer buffer = IoBuffer.allocate(10);
- buffer.put(bts);
- buffer.flip();
- session.write(buffer);
- // // 拿到所有的客户端Session
- // Collection<IoSession> sessions = session.getService().getManagedSessions().values();
- // // 向所有客户端发送数据
- // for (IoSession sess : sessions) {
- // sess.write(buffer);
- // }
- }
- @Override
- public void sessionClosed(IoSession session) throws Exception {
- System.out.println("会话关闭");
- }
- @Override
- public void exceptionCaught(IoSession session, Throwable cause)
- throws Exception {
- System.out.println("会话异常");
- super.exceptionCaught(session, cause);
- }
- @Override
- public void messageSent(IoSession iosession, Object obj) throws Exception {
- System.out.println("服务端消息发送");
- super.messageSent(iosession, obj);
- }
- @Override
- public void sessionCreated(IoSession iosession) throws Exception {
- System.out.println("会话创建");
- super.sessionCreated(iosession);
- }
- @Override
- public void sessionIdle(IoSession iosession, IdleStatus idlestatus)
- throws Exception {
- System.out.println("会话休眠");
- super.sessionIdle(iosession, idlestatus);
- }
- @Override
- public void sessionOpened(IoSession iosession) throws Exception {
- System.out.println("会话打开");
- super.sessionOpened(iosession);
- }
- }
服务端建立端口监听后,收到消息后进入messageReceived()方法,示例处理是打印该消息,然后组装了一个0-9的数据返回回去
注意,即使使用的是Mina,仍需做分包、粘包,等处理,例如有时一条数据不是一次发过来的
客户端程序:
- package com.xd.nms.example;
- import java.net.InetSocketAddress;
- import org.apache.mina.core.buffer.IoBuffer;
- import org.apache.mina.core.future.ConnectFuture;
- import org.apache.mina.core.service.IoConnector;
- import org.apache.mina.core.service.IoHandlerAdapter;
- import org.apache.mina.core.session.IdleStatus;
- import org.apache.mina.core.session.IoSession;
- import org.apache.mina.transport.socket.nio.NioSocketConnector;
- import com.xd.nms.util.ByteAndStr16;
- /**
- * @说明 Mina TCP客户端
- * @author 崔素强
- * @version 1.0
- * @since
- */
- public class MinaTcpClient extends IoHandlerAdapter {
- private IoConnector connector;
- private static IoSession session;
- public MinaTcpClient() {
- connector = new NioSocketConnector();
- connector.setHandler(this);
- ConnectFuture connFuture = connector.connect(new InetSocketAddress("localhost", MinaTcpServer.PORT));
- connFuture.awaitUninterruptibly();
- session = connFuture.getSession();
- System.out.println("TCP 客户端启动");
- }
- public static void main(String[] args) throws Exception {
- MinaTcpClient client = new MinaTcpClient();
- for(int j=0;j<2;j++){ // 发送两遍
- byte[] bts = new byte[20];
- for (int i = 0; i < 20; i++) {
- bts[i] = (byte) i;
- }
- IoBuffer buffer = IoBuffer.allocate(20);
- // 自动扩容
- buffer.setAutoExpand(true);
- // 自动收缩
- buffer.setAutoShrink(true);
- buffer.put(bts);
- buffer.flip();
- session.write(buffer);
- Thread.sleep(2000);
- }
- // 关闭会话,待所有线程处理结束后
- client.connector.dispose(true);
- }
- @Override
- public void messageReceived(IoSession iosession, Object message)
- throws Exception {
- IoBuffer bbuf = (IoBuffer) message;
- byte[] byten = new byte[bbuf.limit()];
- bbuf.get(byten, bbuf.position(), bbuf.limit());
- System.out.println("客户端收到消息" + ByteAndStr16.Bytes2HexString(byten));
- }
- @Override
- public void exceptionCaught(IoSession session, Throwable cause)
- throws Exception {
- System.out.println("客户端异常");
- super.exceptionCaught(session, cause);
- }
- @Override
- public void messageSent(IoSession iosession, Object obj) throws Exception {
- System.out.println("客户端消息发送");
- super.messageSent(iosession, obj);
- }
- @Override
- public void sessionClosed(IoSession iosession) throws Exception {
- System.out.println("客户端会话关闭");
- super.sessionClosed(iosession);
- }
- @Override
- public void sessionCreated(IoSession iosession) throws Exception {
- System.out.println("客户端会话创建");
- super.sessionCreated(iosession);
- }
- @Override
- public void sessionIdle(IoSession iosession, IdleStatus idlestatus)
- throws Exception {
- System.out.println("客户端会话休眠");
- super.sessionIdle(iosession, idlestatus);
- }
- @Override
- public void sessionOpened(IoSession iosession) throws Exception {
- System.out.println("客户端会话打开");
- super.sessionOpened(iosession);
- }
- }
向服务端发送两次0-19的数据,收到消息后同样进入messageReceived()方法,处理同样是打印显示!
打印结果:
- TCP服务启动,端口:18567
- 会话创建
- 会话打开
- 收到消息:00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13
- 服务端消息发送
- 收到消息:00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13
- 服务端消息发送
- 会话关闭
- 客户端会话创建
- 客户端会话打开
- TCP 客户端启动
- 客户端消息发送
- 客户端收到消息00 01 02 03 04 05 06 07 08 09
- 客户端消息发送
- 客户端收到消息00 01 02 03 04 05 06 07 08 09
- 客户端会话关闭
Mina TCP服务端客户端 示例的更多相关文章
- .net for TCP服务端 && 客户端
关键代码 详细代码请看示例代码 Service //创建套接字 IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(ipaddress), port); / ...
- 第5章-unix网络编程 TCP/服务端程序示例
这一章主要是完成一个完整的tcp客户/服务器程序.通过一很简单的例子.弄清客户和服务器如何启动,如何终止,发生了某些错误会发生什么.这些事很重要的 客户端代码 #include "unp. ...
- [javaSE] 网络编程(TCP服务端客户端互访阻塞)
客户端给服务端发送数据,服务端收到数据后,给客户端反馈数据 客户端: 获取Socket对象,new出来,构造参数:String的ip地址,int的端口号 调用Socket对象的getOutputStr ...
- 基于Select模型的Windows TCP服务端和客户端程序示例
最近跟着刘远东老师的<C++百万并发网络通信引擎架构与实现(服务端.客户端.跨平台)>,Bilibili视频地址为C++百万并发网络通信引擎架构与实现(服务端.客户端.跨平台),重新复习下 ...
- TCP/IP网络编程之基于UDP的服务端/客户端
理解UDP 在之前学习TCP的过程中,我们还了解了TCP/IP协议栈.在四层TCP/IP模型中,传输层分为TCP和UDP这两种.数据交换过程可以分为通过TCP套接字完成的TCP方式和通过UDP套接字完 ...
- TCP/IP网络编程之基于TCP的服务端/客户端(二)
回声客户端问题 上一章TCP/IP网络编程之基于TCP的服务端/客户端(一)中,我们解释了回声客户端所存在的问题,那么单单是客户端的问题,服务端没有任何问题?是的,服务端没有问题,现在先让我们回顾下服 ...
- TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端)、UDP客户端
目录 说明 TCP/UDP通信主要结构 管理多个Socket的解决方案 框架中TCP部分的使用 框架中UDP部分的使用 框架源码结构 补充说明 源码地址 说明 之前有好几篇博客在讲TCP/UDP通信方 ...
- Java TCP服务端向客户端发送图片
/** * 1.创建TCP服务端,TCP客户端 * 2.服务端等待客户端连接,客户端连接后,服务端向客户端写入图片 * 3.客户端收到后进行文件保存 * @author Administrator * ...
- TCP和UDP的区别以及使用python服务端客户端简单编程
一.TCP.UDP区别总结 1.TCP面向连接(如打电话要先拨号建立连接):UDP是无连接的,即发送数据之前不需要建立连接 2.TCP提供可靠的服务,也就是说,通过TCP连接传送的数据,无差错,不丢失 ...
随机推荐
- spring中的原型模式
大家好,我原本是神剑山庄的铸剑师,名叫小赵,本来干的好好的,后来一时兴起,睡了三少爷的小姨子,与其一直提心吊胆,干脆来个逃之夭夭. 但是,我也要吃饭的呀,工作也得找,神剑山庄去不得,还有断剑山庄.藏剑 ...
- nginx upstream 容错机制
熟练掌握Nginx负载均衡的使用对运维人员来说是极其重要的!下面针对Nignx负载均衡upstream容错机制的使用做一梳理性说明: 一.nginx的upstream容错 1)nginx 判断节点失效 ...
- MySQL问题:Access denied for user 'mysql'@'localhost'
deep@deep-PC:~$ sudo mysql -uroot -p mysql> update mysql.user set authentication_string=PASSWORD( ...
- How to Create and Use Facebook Messenger Codes (June 2019)
How to Create and Use Facebook Messenger Codes (June 2019) By Gerardo Salandra What is a Messenger ...
- C\C++中的 struct 关键字详解
struct关键字是用来定义一个新的类型,这个新类型里面可以包含各种其他类型,称为结构体. 1. 什么是结构体 结构体(struct)是一种自定义的数据类型,就是把一组需要在一起使用的数据元素组合成一 ...
- 金士顿U盘PS2251-07东芝闪存白片量产CDROM成功教程-群联量产教程-U盘量产网
之前我们发布过金士顿DT100 G3的黑片量产工具教程,因为白片的MPALL量产工具无法量产,所有版本的Phison_MPALL都爆红,最近出了新的白片MPALL V5.03.0A版本,所以试了一下结 ...
- NDK学习笔记-增量更新
虽然现在有插件化开发和热修复,但为何还需要增量更新?插件化开发和热修复依赖于宿主程序,增量更新适合更新宿主程序. 差分包生成的前提 差分包的生成依赖于BsDiff开源项目,而BsDiff又依赖于Bzi ...
- 【AtCoder】AGC004
AGC004 A - Divide a Cuboid 看哪一维是偶数,答案是0,否则是三个数两两组合相乘中最小的那个 #include <bits/stdc++.h> #define fi ...
- Scala当中什么是RDD(Resilient Distributed Datasets)弹性分布式数据集
RDD(Resilient Distributed Datasets)弹性分布式数据集.你不好理解的话,可以把RDD就可以看成是一个简单的"动态数组"(比如ArrayList),对 ...
- Python 【Debug排除程序故障】
debug #排除程序故障 print()函数常和#号注释结合在一起用来debug 多行注释有两种快捷操作:1.在需要注释的多行代码块前后加一组三引号''' 2.选中代码后使用快捷键操作:Window ...