服务端代码:

  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. kafka的学习(一)

    写在最前面,先简单讲解一些kafka的概念: 一.概念1.1 kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据.Brokerkafka集群包含一个或者多个 ...

  2. 3GPP 5G UPF

    目录 文章目录 目录 UPF 参考文档 UPF UPF(User Plane Function,用户面功能),是 3GPP 定义的 5G Core(核心网)基础设施系统架构的基本组成部分. UPF 从 ...

  3. Centos D-Bus connection: Operation not permitted

    解决办法: 首先要先在后台启动一个 CentOS7 容器(注意不要少参数): docker run -d -e "container=docker" --privileged=tr ...

  4. JAVA 基础编程练习题48 【程序 48 加密】

    48 [程序 48 加密] 题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密 规则如下:每位数字都加上 5,然后用和除以 10 的余数代替该数字,再将第一位和第四位交 ...

  5. phpcms前台无法退出无法清除cookie

    phpcms前台无法退出无法清除cookie 如果caches\configs\system.php 中的cookie_path 设置为空..就会出现退不出的情况..设置为'cookie_path' ...

  6. Oracle查询显示CLOB的内容

    select dbms_lob.substr(note)  from table

  7. Centos7下 升级php5.4到7.1 yum安装

    1.查看当前 PHP 版本 php -v 查看当前 PHP 相关的安装包,删除之 yum list installed | grep php yum remove php yum remove php ...

  8. spring 机制 扫描包

    控制器示例 扫描包注解代码 @SpringBootApplication(scanBasePackages = {"cn.maxhou.*"}) 引号内为包名,支持*通配符 为什么 ...

  9. PTA(Advanced Level)1044.Shopping in Mars

    Shopping in Mars is quite a different experience. The Mars people pay by chained diamonds. Each diam ...

  10. Spring Boot CommandLineRunner的使用

    1. 说明 程序在启动完成的时候需要去处理某些业务,因此Spring Boot程序中需要去实现CommandLineRunner接口. 2. CommandLineRunner方法执行顺序 程序启动后 ...