服务端代码:

  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. python 获取昨天的日期

    from datetime import timedelta, datetime yesterday = datetime.today()+timedelta(-1) yesterday_format ...

  2. mongodb 添加用户报错TypeError:db.addUser is not a function (mongodb3.4.1)

    1:问题如下: 原因是 新版的MongoDB已经不支持addUser方法了. 改成createUser了. 使用方法如下    2:具体解释一下db.createUser()方法的用法   定义: 创 ...

  3. Qt编写自定义控件27-颜色按钮面板

    一.前言 颜色按钮面板主要用在提供一个颜色按钮面板,用户单击某个按钮,然后拿到对应的颜色值,用户可以预先设定常用的颜色集合,传入到控件中,自动生成面板颜色集合按钮,每当滑过按钮的时候,按钮边缘高亮提示 ...

  4. python中星号变量的几种特殊用法

    python中星号变量的几种特殊用法 不知道大家知不知道在Python中,星号除了用于乘法数值运算和幂运算外,还有一种特殊的用法"在变量前添加单个星号或两个星号",实现多参数的传入 ...

  5. 【leetcode】500_Keyboard Row

    problem 500. Keyboard Row 题意:判断给出的某个单词是否可以使用键盘上的某一行字母type得到: 注意大小写的转换: solution1: 使用set保存三行字符,查看每个字符 ...

  6. Bash Shellshock(CVE-2014-6271)破壳漏洞测试

    0x01 漏洞原理 Bash使用的环境变量是通过函数名称来调用的,导致漏洞出问题是以"(){"开头定义的环境变量在命令ENV中解析成函数后,Bash执行并未退出,而是继续解析并执行 ...

  7. Django -- DateTimeField

    默认为时区时间时,需要导入django内置的timezone模块 from django.utils import timezone create_at = models.DateTimeField( ...

  8. Eclipse阿里代码规范插件安装,卸载与使用

    使用阿里代码规范插件,我们就可以查看我们写的代码是否规范了 找到阿里代码插件网址: 网址:https://p3c.alibaba.com/plugin/eclipse/update/ 打开我们的网址, ...

  9. python知识储备目录

    1.with as 的实现原理 https://www.cnblogs.com/lice-blog/p/11581741.html 2.事务的四个隔离级别 3.rabitMQ 4.c3算法 5.wit ...

  10. python第二部分

    什么数据类型? int 1, 2, 3 用来运算的 float 1.2 str 用来存储一定的信息"" '' list =[1,2 ,3 "有", 是]用来存储 ...