服务端代码:

  1. package com.xd.nms.example;
  2. import java.io.IOException;
  3. import java.net.InetSocketAddress;
  4. import org.apache.mina.core.buffer.IoBuffer;
  5. import org.apache.mina.core.service.IoHandlerAdapter;
  6. import org.apache.mina.core.session.IdleStatus;
  7. import org.apache.mina.core.session.IoSession;
  8. import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
  9. import com.xd.nms.util.ByteAndStr16;
  10. /**
  11. * @说明 Mina TCP 服务端
  12. * @author 崔素强
  13. * @version 1.0
  14. * @since
  15. */
  16. public class MinaTcpServer extends IoHandlerAdapter {
  17. public static final int PORT = 18567;
  18. public MinaTcpServer() throws IOException {
  19. NioSocketAcceptor acceptor = new NioSocketAcceptor();
  20. acceptor.setHandler(this);
  21. acceptor.bind(new InetSocketAddress(PORT));
  22. System.out.println("TCP服务启动,端口:" + PORT);
  23. }
  24. public static void main(String[] args) throws IOException {
  25. new MinaTcpServer();
  26. }
  27. @Override
  28. public void messageReceived(IoSession session, Object message)
  29. throws Exception {
  30. IoBuffer bbuf = (IoBuffer) message;
  31. byte[] byten = new byte[bbuf.limit()];
  32. bbuf.get(byten, bbuf.position(), bbuf.limit());
  33. System.out.println("收到消息:" + ByteAndStr16.Bytes2HexString(byten));
  34. byte[] bts = new byte[10];
  35. for(int i=0;i<10;i++){
  36. bts[i] = (byte)i;
  37. }
  38. IoBuffer buffer = IoBuffer.allocate(10);
  39. buffer.put(bts);
  40. buffer.flip();
  41. session.write(buffer);
  42. //      // 拿到所有的客户端Session
  43. //      Collection<IoSession> sessions = session.getService().getManagedSessions().values();
  44. //      // 向所有客户端发送数据
  45. //      for (IoSession sess : sessions) {
  46. //          sess.write(buffer);
  47. //      }
  48. }
  49. @Override
  50. public void sessionClosed(IoSession session) throws Exception {
  51. System.out.println("会话关闭");
  52. }
  53. @Override
  54. public void exceptionCaught(IoSession session, Throwable cause)
  55. throws Exception {
  56. System.out.println("会话异常");
  57. super.exceptionCaught(session, cause);
  58. }
  59. @Override
  60. public void messageSent(IoSession iosession, Object obj) throws Exception {
  61. System.out.println("服务端消息发送");
  62. super.messageSent(iosession, obj);
  63. }
  64. @Override
  65. public void sessionCreated(IoSession iosession) throws Exception {
  66. System.out.println("会话创建");
  67. super.sessionCreated(iosession);
  68. }
  69. @Override
  70. public void sessionIdle(IoSession iosession, IdleStatus idlestatus)
  71. throws Exception {
  72. System.out.println("会话休眠");
  73. super.sessionIdle(iosession, idlestatus);
  74. }
  75. @Override
  76. public void sessionOpened(IoSession iosession) throws Exception {
  77. System.out.println("会话打开");
  78. super.sessionOpened(iosession);
  79. }
  80. }

服务端建立端口监听后,收到消息后进入messageReceived()方法,示例处理是打印该消息,然后组装了一个0-9的数据返回回去

注意,即使使用的是Mina,仍需做分包、粘包,等处理,例如有时一条数据不是一次发过来的

客户端程序:

  1. package com.xd.nms.example;
  2. import java.net.InetSocketAddress;
  3. import org.apache.mina.core.buffer.IoBuffer;
  4. import org.apache.mina.core.future.ConnectFuture;
  5. import org.apache.mina.core.service.IoConnector;
  6. import org.apache.mina.core.service.IoHandlerAdapter;
  7. import org.apache.mina.core.session.IdleStatus;
  8. import org.apache.mina.core.session.IoSession;
  9. import org.apache.mina.transport.socket.nio.NioSocketConnector;
  10. import com.xd.nms.util.ByteAndStr16;
  11. /**
  12. * @说明 Mina TCP客户端
  13. * @author 崔素强
  14. * @version 1.0
  15. * @since
  16. */
  17. public class MinaTcpClient extends IoHandlerAdapter {
  18. private IoConnector connector;
  19. private static IoSession session;
  20. public MinaTcpClient() {
  21. connector = new NioSocketConnector();
  22. connector.setHandler(this);
  23. ConnectFuture connFuture = connector.connect(new InetSocketAddress("localhost", MinaTcpServer.PORT));
  24. connFuture.awaitUninterruptibly();
  25. session = connFuture.getSession();
  26. System.out.println("TCP 客户端启动");
  27. }
  28. public static void main(String[] args) throws Exception {
  29. MinaTcpClient client = new MinaTcpClient();
  30. for(int j=0;j<2;j++){ // 发送两遍
  31. byte[] bts = new byte[20];
  32. for (int i = 0; i < 20; i++) {
  33. bts[i] = (byte) i;
  34. }
  35. IoBuffer buffer = IoBuffer.allocate(20);
  36. // 自动扩容
  37. buffer.setAutoExpand(true);
  38. // 自动收缩
  39. buffer.setAutoShrink(true);
  40. buffer.put(bts);
  41. buffer.flip();
  42. session.write(buffer);
  43. Thread.sleep(2000);
  44. }
  45. // 关闭会话,待所有线程处理结束后
  46. client.connector.dispose(true);
  47. }
  48. @Override
  49. public void messageReceived(IoSession iosession, Object message)
  50. throws Exception {
  51. IoBuffer bbuf = (IoBuffer) message;
  52. byte[] byten = new byte[bbuf.limit()];
  53. bbuf.get(byten, bbuf.position(), bbuf.limit());
  54. System.out.println("客户端收到消息" + ByteAndStr16.Bytes2HexString(byten));
  55. }
  56. @Override
  57. public void exceptionCaught(IoSession session, Throwable cause)
  58. throws Exception {
  59. System.out.println("客户端异常");
  60. super.exceptionCaught(session, cause);
  61. }
  62. @Override
  63. public void messageSent(IoSession iosession, Object obj) throws Exception {
  64. System.out.println("客户端消息发送");
  65. super.messageSent(iosession, obj);
  66. }
  67. @Override
  68. public void sessionClosed(IoSession iosession) throws Exception {
  69. System.out.println("客户端会话关闭");
  70. super.sessionClosed(iosession);
  71. }
  72. @Override
  73. public void sessionCreated(IoSession iosession) throws Exception {
  74. System.out.println("客户端会话创建");
  75. super.sessionCreated(iosession);
  76. }
  77. @Override
  78. public void sessionIdle(IoSession iosession, IdleStatus idlestatus)
  79. throws Exception {
  80. System.out.println("客户端会话休眠");
  81. super.sessionIdle(iosession, idlestatus);
  82. }
  83. @Override
  84. public void sessionOpened(IoSession iosession) throws Exception {
  85. System.out.println("客户端会话打开");
  86. super.sessionOpened(iosession);
  87. }
  88. }

向服务端发送两次0-19的数据,收到消息后同样进入messageReceived()方法,处理同样是打印显示!

打印结果:

  1. TCP服务启动,端口:18567
  2. 会话创建
  3. 会话打开
  4. 收到消息:00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13
  5. 服务端消息发送
  6. 收到消息:00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13
  7. 服务端消息发送
  8. 会话关闭
  1. 客户端会话创建
  2. 客户端会话打开
  3. TCP 客户端启动
  4. 客户端消息发送
  5. 客户端收到消息00 01 02 03 04 05 06 07 08 09
  6. 客户端消息发送
  7. 客户端收到消息00 01 02 03 04 05 06 07 08 09
  8. 客户端会话关闭

Mina TCP服务端客户端 示例的更多相关文章

  1. .net for TCP服务端 && 客户端

    关键代码 详细代码请看示例代码 Service //创建套接字 IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(ipaddress), port); / ...

  2. 第5章-unix网络编程 TCP/服务端程序示例

    这一章主要是完成一个完整的tcp客户/服务器程序.通过一很简单的例子.弄清客户和服务器如何启动,如何终止,发生了某些错误会发生什么.这些事很重要的  客户端代码 #include "unp. ...

  3. [javaSE] 网络编程(TCP服务端客户端互访阻塞)

    客户端给服务端发送数据,服务端收到数据后,给客户端反馈数据 客户端: 获取Socket对象,new出来,构造参数:String的ip地址,int的端口号 调用Socket对象的getOutputStr ...

  4. 基于Select模型的Windows TCP服务端和客户端程序示例

    最近跟着刘远东老师的<C++百万并发网络通信引擎架构与实现(服务端.客户端.跨平台)>,Bilibili视频地址为C++百万并发网络通信引擎架构与实现(服务端.客户端.跨平台),重新复习下 ...

  5. TCP/IP网络编程之基于UDP的服务端/客户端

    理解UDP 在之前学习TCP的过程中,我们还了解了TCP/IP协议栈.在四层TCP/IP模型中,传输层分为TCP和UDP这两种.数据交换过程可以分为通过TCP套接字完成的TCP方式和通过UDP套接字完 ...

  6. TCP/IP网络编程之基于TCP的服务端/客户端(二)

    回声客户端问题 上一章TCP/IP网络编程之基于TCP的服务端/客户端(一)中,我们解释了回声客户端所存在的问题,那么单单是客户端的问题,服务端没有任何问题?是的,服务端没有问题,现在先让我们回顾下服 ...

  7. TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端)、UDP客户端

    目录 说明 TCP/UDP通信主要结构 管理多个Socket的解决方案 框架中TCP部分的使用 框架中UDP部分的使用 框架源码结构 补充说明 源码地址 说明 之前有好几篇博客在讲TCP/UDP通信方 ...

  8. Java TCP服务端向客户端发送图片

    /** * 1.创建TCP服务端,TCP客户端 * 2.服务端等待客户端连接,客户端连接后,服务端向客户端写入图片 * 3.客户端收到后进行文件保存 * @author Administrator * ...

  9. TCP和UDP的区别以及使用python服务端客户端简单编程

    一.TCP.UDP区别总结 1.TCP面向连接(如打电话要先拨号建立连接):UDP是无连接的,即发送数据之前不需要建立连接 2.TCP提供可靠的服务,也就是说,通过TCP连接传送的数据,无差错,不丢失 ...

随机推荐

  1. python3 @classmethod 和 @staticmethod 的区别

    如果您将某个东西定义为classmethod,这可能是因为您打算从类而不是类实例中调用它. 定义类方法的几种方式: 常规方式                       : 需要self隐士传递当前类 ...

  2. nginx虚拟主机添加

    1. 进入 /usr/local/nginx/conf/vhost 目录, 创建虚拟主机配置文件 wbs.test.com.conf ({域名}.conf). 2.打开配置文件, 添加服务如下: lo ...

  3. 使用apache commons csv解析del(类似csv)格式文件

    del格式类似csv,我这里的测试文件test.del是从DB2数据库中导出来的一组数据. apache commons csv的maven坐标为: <!-- https://mvnreposi ...

  4. Linux操作系统使用RPMBUILD命令打包RPM的详细步骤

    首先,我们需要了解一些预备知识,在旧版本的CentOS中,rpmbuild工具默认的工作路径是/usr/src/redhat,因为权限原因,一般用户身份不能制作rpm软件包,只能切换到root身份才能 ...

  5. C语言tips_2 关于scanf 读取规则小结以及与getchar 的区别

    第一点:scanf默认回车和空格是输入不同组之间的间隔和结束符号. 也就是说他不会读取 空格 和 换行符.而是把他们当作一个 数据被读取完成的标志!他的停止标志则为,当%d之类的数据输入结束之后,自动 ...

  6. systemctl daemon-reload

    systemctl daemon-reload: 重新加载某个服务的配置文件,如果新安装了一个服务,归属于 systemctl 管理,要是新服务的服务程序配置文件生效,需重新加载. init 和 sy ...

  7. linux基本防护措施,权限分配和提高防护安全

    设置用户失效 1.失效的用户将无法登录 使用chage命令将用户zhangsan的账户设为当前已失效(比如已经过去的某个时间): [root@proxy ~]# useradd zhangsan [r ...

  8. PCM-FTL

    1. 运行时第一行需要是write 错误位置 trace_stat->sectors += length;

  9. POJ3259 Wormholes 【spfa判负环】

    题目链接:http://poj.org/problem?id=3259 Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submis ...

  10. Holy Grail【spfa求最短路】

    题目链接:https://www.jisuanke.com/contest/3004?view=challenges 题目大意: 1.一个无向图,给出六个顶点,添六条边,但是添边是有限制的.每次添边的 ...