Mina TCP服务端客户端 示例
服务端代码:
- package com.xd.nms.example;
- import java.io.IOException;
- import java.net.InetSocketAddress;
- import org.apache.mina.core.buffer.IoBuffer;
- import org.apache.mina.core.service.IoHandlerAdapter;
- import org.apache.mina.core.session.IdleStatus;
- import org.apache.mina.core.session.IoSession;
- import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
- import com.xd.nms.util.ByteAndStr16;
- /**
- * @说明 Mina TCP 服务端
- * @author 崔素强
- * @version 1.0
- * @since
- */
- public class MinaTcpServer extends IoHandlerAdapter {
- public static final int PORT = 18567;
- public MinaTcpServer() throws IOException {
- NioSocketAcceptor acceptor = new NioSocketAcceptor();
- acceptor.setHandler(this);
- acceptor.bind(new InetSocketAddress(PORT));
- System.out.println("TCP服务启动,端口:" + PORT);
- }
- public static void main(String[] args) throws IOException {
- new MinaTcpServer();
- }
- @Override
- public void messageReceived(IoSession session, Object message)
- throws Exception {
- IoBuffer bbuf = (IoBuffer) message;
- byte[] byten = new byte[bbuf.limit()];
- bbuf.get(byten, bbuf.position(), bbuf.limit());
- System.out.println("收到消息:" + ByteAndStr16.Bytes2HexString(byten));
- byte[] bts = new byte[10];
- for(int i=0;i<10;i++){
- bts[i] = (byte)i;
- }
- IoBuffer buffer = IoBuffer.allocate(10);
- buffer.put(bts);
- buffer.flip();
- session.write(buffer);
- // // 拿到所有的客户端Session
- // Collection<IoSession> sessions = session.getService().getManagedSessions().values();
- // // 向所有客户端发送数据
- // for (IoSession sess : sessions) {
- // sess.write(buffer);
- // }
- }
- @Override
- public void sessionClosed(IoSession session) throws Exception {
- System.out.println("会话关闭");
- }
- @Override
- public void exceptionCaught(IoSession session, Throwable cause)
- throws Exception {
- System.out.println("会话异常");
- super.exceptionCaught(session, cause);
- }
- @Override
- public void messageSent(IoSession iosession, Object obj) throws Exception {
- System.out.println("服务端消息发送");
- super.messageSent(iosession, obj);
- }
- @Override
- public void sessionCreated(IoSession iosession) throws Exception {
- System.out.println("会话创建");
- super.sessionCreated(iosession);
- }
- @Override
- public void sessionIdle(IoSession iosession, IdleStatus idlestatus)
- throws Exception {
- System.out.println("会话休眠");
- super.sessionIdle(iosession, idlestatus);
- }
- @Override
- public void sessionOpened(IoSession iosession) throws Exception {
- System.out.println("会话打开");
- super.sessionOpened(iosession);
- }
- }
服务端建立端口监听后,收到消息后进入messageReceived()方法,示例处理是打印该消息,然后组装了一个0-9的数据返回回去
注意,即使使用的是Mina,仍需做分包、粘包,等处理,例如有时一条数据不是一次发过来的
客户端程序:
- package com.xd.nms.example;
- import java.net.InetSocketAddress;
- import org.apache.mina.core.buffer.IoBuffer;
- import org.apache.mina.core.future.ConnectFuture;
- import org.apache.mina.core.service.IoConnector;
- import org.apache.mina.core.service.IoHandlerAdapter;
- import org.apache.mina.core.session.IdleStatus;
- import org.apache.mina.core.session.IoSession;
- import org.apache.mina.transport.socket.nio.NioSocketConnector;
- import com.xd.nms.util.ByteAndStr16;
- /**
- * @说明 Mina TCP客户端
- * @author 崔素强
- * @version 1.0
- * @since
- */
- public class MinaTcpClient extends IoHandlerAdapter {
- private IoConnector connector;
- private static IoSession session;
- public MinaTcpClient() {
- connector = new NioSocketConnector();
- connector.setHandler(this);
- ConnectFuture connFuture = connector.connect(new InetSocketAddress("localhost", MinaTcpServer.PORT));
- connFuture.awaitUninterruptibly();
- session = connFuture.getSession();
- System.out.println("TCP 客户端启动");
- }
- public static void main(String[] args) throws Exception {
- MinaTcpClient client = new MinaTcpClient();
- for(int j=0;j<2;j++){ // 发送两遍
- byte[] bts = new byte[20];
- for (int i = 0; i < 20; i++) {
- bts[i] = (byte) i;
- }
- IoBuffer buffer = IoBuffer.allocate(20);
- // 自动扩容
- buffer.setAutoExpand(true);
- // 自动收缩
- buffer.setAutoShrink(true);
- buffer.put(bts);
- buffer.flip();
- session.write(buffer);
- Thread.sleep(2000);
- }
- // 关闭会话,待所有线程处理结束后
- client.connector.dispose(true);
- }
- @Override
- public void messageReceived(IoSession iosession, Object message)
- throws Exception {
- IoBuffer bbuf = (IoBuffer) message;
- byte[] byten = new byte[bbuf.limit()];
- bbuf.get(byten, bbuf.position(), bbuf.limit());
- System.out.println("客户端收到消息" + ByteAndStr16.Bytes2HexString(byten));
- }
- @Override
- public void exceptionCaught(IoSession session, Throwable cause)
- throws Exception {
- System.out.println("客户端异常");
- super.exceptionCaught(session, cause);
- }
- @Override
- public void messageSent(IoSession iosession, Object obj) throws Exception {
- System.out.println("客户端消息发送");
- super.messageSent(iosession, obj);
- }
- @Override
- public void sessionClosed(IoSession iosession) throws Exception {
- System.out.println("客户端会话关闭");
- super.sessionClosed(iosession);
- }
- @Override
- public void sessionCreated(IoSession iosession) throws Exception {
- System.out.println("客户端会话创建");
- super.sessionCreated(iosession);
- }
- @Override
- public void sessionIdle(IoSession iosession, IdleStatus idlestatus)
- throws Exception {
- System.out.println("客户端会话休眠");
- super.sessionIdle(iosession, idlestatus);
- }
- @Override
- public void sessionOpened(IoSession iosession) throws Exception {
- System.out.println("客户端会话打开");
- super.sessionOpened(iosession);
- }
- }
向服务端发送两次0-19的数据,收到消息后同样进入messageReceived()方法,处理同样是打印显示!
打印结果:
- TCP服务启动,端口:18567
- 会话创建
- 会话打开
- 收到消息:00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13
- 服务端消息发送
- 收到消息:00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13
- 服务端消息发送
- 会话关闭
- 客户端会话创建
- 客户端会话打开
- TCP 客户端启动
- 客户端消息发送
- 客户端收到消息00 01 02 03 04 05 06 07 08 09
- 客户端消息发送
- 客户端收到消息00 01 02 03 04 05 06 07 08 09
- 客户端会话关闭
Mina TCP服务端客户端 示例的更多相关文章
- .net for TCP服务端 && 客户端
关键代码 详细代码请看示例代码 Service //创建套接字 IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(ipaddress), port); / ...
- 第5章-unix网络编程 TCP/服务端程序示例
这一章主要是完成一个完整的tcp客户/服务器程序.通过一很简单的例子.弄清客户和服务器如何启动,如何终止,发生了某些错误会发生什么.这些事很重要的 客户端代码 #include "unp. ...
- [javaSE] 网络编程(TCP服务端客户端互访阻塞)
客户端给服务端发送数据,服务端收到数据后,给客户端反馈数据 客户端: 获取Socket对象,new出来,构造参数:String的ip地址,int的端口号 调用Socket对象的getOutputStr ...
- 基于Select模型的Windows TCP服务端和客户端程序示例
最近跟着刘远东老师的<C++百万并发网络通信引擎架构与实现(服务端.客户端.跨平台)>,Bilibili视频地址为C++百万并发网络通信引擎架构与实现(服务端.客户端.跨平台),重新复习下 ...
- TCP/IP网络编程之基于UDP的服务端/客户端
理解UDP 在之前学习TCP的过程中,我们还了解了TCP/IP协议栈.在四层TCP/IP模型中,传输层分为TCP和UDP这两种.数据交换过程可以分为通过TCP套接字完成的TCP方式和通过UDP套接字完 ...
- TCP/IP网络编程之基于TCP的服务端/客户端(二)
回声客户端问题 上一章TCP/IP网络编程之基于TCP的服务端/客户端(一)中,我们解释了回声客户端所存在的问题,那么单单是客户端的问题,服务端没有任何问题?是的,服务端没有问题,现在先让我们回顾下服 ...
- TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端)、UDP客户端
目录 说明 TCP/UDP通信主要结构 管理多个Socket的解决方案 框架中TCP部分的使用 框架中UDP部分的使用 框架源码结构 补充说明 源码地址 说明 之前有好几篇博客在讲TCP/UDP通信方 ...
- Java TCP服务端向客户端发送图片
/** * 1.创建TCP服务端,TCP客户端 * 2.服务端等待客户端连接,客户端连接后,服务端向客户端写入图片 * 3.客户端收到后进行文件保存 * @author Administrator * ...
- TCP和UDP的区别以及使用python服务端客户端简单编程
一.TCP.UDP区别总结 1.TCP面向连接(如打电话要先拨号建立连接):UDP是无连接的,即发送数据之前不需要建立连接 2.TCP提供可靠的服务,也就是说,通过TCP连接传送的数据,无差错,不丢失 ...
随机推荐
- context_processor 上下文处理器
context_processor 上下文处理器 博客里面有三个地方用到了标签云:主页面,分类页面,博客详情页面,于是有了下面一段代码 # 主页面 @main.route("/") ...
- Eclipse部署时项目中依赖的jar包不能部署到服务器WEB-IN下lib目录
转: Eclipse部署时项目lib下jar包不能部署到服务器WEB-IN下lib目录及Eclipse下tomcat服务器配置修改 2018年04月07日 11:04:19 拾悦酒吧 阅读数 1046 ...
- Java Web之过滤器(Filter)
转: Java Web之过滤器(Filter) 2018年07月31日 16:58:40 喻志强 阅读数 13705更多 所属专栏: Java Web入门 版权声明:本文为博主原创文章, 转载请注 ...
- 记录一次vxworks下使用NFS组件的过程
问题:有三块CPU都运行vxworks6.9,现在想要CPU3做server,CPU1-2通过NFS访问CPU3上的文件 补充:使用防火墙可能会影响NFS访问,目前我还没有找到解决办法... 下面是过 ...
- RAID概念记录
之前对RAID概念有一些基本的认知,这次同事培训k8s 的持久卷,提到了RAID的一些概念和用法,记录一下. RAID ( Redundant Array of Independent Disks ) ...
- Vue学习笔记(四)一起进阶吧
参考链接地址:https://segmentfault.com/a/1190000009188689?from=timeline Vuex框架原理与源码分析: http://tech.meituan. ...
- python列表删除--remove(),del,pop()
remove()参数为列表元素,若在列表中,删除,不在则报错 如: pop()不带参数时默认删除列表的末尾元素并返回该元素,带参数时该参数为列表元素的下标值 不带参数: 以下标为参数: del 后面可 ...
- 【Matlab开发】matlab中bar绘图设置与各种距离度量
[Matlab开发]matlab中bar绘图设置与各种距离度量 标签(空格分隔): [Matlab开发] [机器学习] 声明:引用请注明出处http://blog.csdn.net/lg1259156 ...
- Odoo 13 released..
origin https://medium.com/@jc_57445/odoo-13-is-fantastic-f2b421696b49 Most striking changes The most ...
- Charles系列一:Charles功能介绍、下载安装和界面简介
一:Charles主要功能介绍 Charles是一个HTTP代理/HTTP监视器/反向代理,使开发和测试人员能够查看机器和Internet之间所有的HTTP和SSL/HTTPS流量,这包括请求,响应. ...