服务端代码:

  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. spring中的原型模式

    大家好,我原本是神剑山庄的铸剑师,名叫小赵,本来干的好好的,后来一时兴起,睡了三少爷的小姨子,与其一直提心吊胆,干脆来个逃之夭夭. 但是,我也要吃饭的呀,工作也得找,神剑山庄去不得,还有断剑山庄.藏剑 ...

  2. nginx upstream 容错机制

    熟练掌握Nginx负载均衡的使用对运维人员来说是极其重要的!下面针对Nignx负载均衡upstream容错机制的使用做一梳理性说明: 一.nginx的upstream容错 1)nginx 判断节点失效 ...

  3. MySQL问题:Access denied for user 'mysql'@'localhost'

    deep@deep-PC:~$ sudo mysql -uroot -p mysql> update mysql.user set authentication_string=PASSWORD( ...

  4. 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 ...

  5. C\C++中的 struct 关键字详解

    struct关键字是用来定义一个新的类型,这个新类型里面可以包含各种其他类型,称为结构体. 1. 什么是结构体 结构体(struct)是一种自定义的数据类型,就是把一组需要在一起使用的数据元素组合成一 ...

  6. 金士顿U盘PS2251-07东芝闪存白片量产CDROM成功教程-群联量产教程-U盘量产网

    之前我们发布过金士顿DT100 G3的黑片量产工具教程,因为白片的MPALL量产工具无法量产,所有版本的Phison_MPALL都爆红,最近出了新的白片MPALL V5.03.0A版本,所以试了一下结 ...

  7. NDK学习笔记-增量更新

    虽然现在有插件化开发和热修复,但为何还需要增量更新?插件化开发和热修复依赖于宿主程序,增量更新适合更新宿主程序. 差分包生成的前提 差分包的生成依赖于BsDiff开源项目,而BsDiff又依赖于Bzi ...

  8. 【AtCoder】AGC004

    AGC004 A - Divide a Cuboid 看哪一维是偶数,答案是0,否则是三个数两两组合相乘中最小的那个 #include <bits/stdc++.h> #define fi ...

  9. Scala当中什么是RDD(Resilient Distributed Datasets)弹性分布式数据集

    RDD(Resilient Distributed Datasets)弹性分布式数据集.你不好理解的话,可以把RDD就可以看成是一个简单的"动态数组"(比如ArrayList),对 ...

  10. Python 【Debug排除程序故障】

    debug #排除程序故障 print()函数常和#号注释结合在一起用来debug 多行注释有两种快捷操作:1.在需要注释的多行代码块前后加一组三引号''' 2.选中代码后使用快捷键操作:Window ...