服务端代码:

  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. BigDecimal数据的加 减 乘 除 N次幂运算 以及比较大小

    在实际开开发过程中BigDecimal是一个经常用到的类: 它可以进行大数值的精确却运算,下面介绍一下它的加-减-乘-除以及N次幂的操作操作 import java.math.BigDecimal; ...

  2. BigDecimal的toString和toPlainString区别

    创建一个BigDecimal的数,分别调用toPlainString和toString方法 import java.math.BigDecimal; public class Test05 { pub ...

  3. 仙剑奇侠传1系列:2.编译主程序SDLPAL及SDL

    上一篇:仙剑奇侠传1系列:1.本地运行环境及兼容性设置 介绍 仙剑奇侠传1是dos时代的经典游戏,相信以下图片能勾起大家的很多回忆.   sdlpal是仙剑奇侠传1的主程序.github项目sdlpa ...

  4. ubuntu 安装的一些软件

    https://github.com/wszqkzqk/deepin-wine-ubuntu 14 版本的ubuntu  安装发生问题; 16 18 的都可以安装成功微信;

  5. 给数据库授权,否则程序、navicat无法连接数据库的,每创建一个数据库都要给数据库授权

    给数据库授权,否则程序.navicat无法连接test1数据库的 mysql> grant all privileges on test1.* TO 'root'@'%' identified ...

  6. System.Web.UI.Page的用法,一定要学会懒

    在ASP.NET中,任何页面都是继承于System.Web.UI.Page,他提供了ASP.NET中的Response,Request,Session,Application的操作.在使用Visual ...

  7. ES6、ES7、ES8、ES9、ES10

    ES6新特性(2015) ES6的特性比较多,在 ES5 发布近 6 年(2009-11 至 2015-6)之后才将其标准化.两个发布版本之间时间跨度很大,所以ES6中的特性比较多.在这里列举几个常用 ...

  8. 【Python】机器学习之单变量线性回归 利用正规方程找到合适的参数值

    [Python]机器学习之单变量线性回归 利用正规方程找到合适的参数值 本次作业来自吴恩达机器学习. 你是一个餐厅的老板,你想在其他城市开分店,所以你得到了一些数据(数据在本文最下方),数据中包括不同 ...

  9. Python安装pip3

    在新的电脑上,偶尔会出现无法安装pip的问题. 今天看见了一位大神的方法: 在cmd窗口中输入python -m ensurepip 然后使用pip命令安装其他包.pip3 install 模块名 说 ...

  10. pacemaker入门

    原文链接:https://blog.csdn.net/a964921988/article/details/82628478 因为数据库部署在Linux上,需要做数据库集群实现高可用,而所有的Post ...