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连接传送的数据,无差错,不丢失 ...
随机推荐
- python3 @classmethod 和 @staticmethod 的区别
如果您将某个东西定义为classmethod,这可能是因为您打算从类而不是类实例中调用它. 定义类方法的几种方式: 常规方式 : 需要self隐士传递当前类 ...
- nginx虚拟主机添加
1. 进入 /usr/local/nginx/conf/vhost 目录, 创建虚拟主机配置文件 wbs.test.com.conf ({域名}.conf). 2.打开配置文件, 添加服务如下: lo ...
- 使用apache commons csv解析del(类似csv)格式文件
del格式类似csv,我这里的测试文件test.del是从DB2数据库中导出来的一组数据. apache commons csv的maven坐标为: <!-- https://mvnreposi ...
- Linux操作系统使用RPMBUILD命令打包RPM的详细步骤
首先,我们需要了解一些预备知识,在旧版本的CentOS中,rpmbuild工具默认的工作路径是/usr/src/redhat,因为权限原因,一般用户身份不能制作rpm软件包,只能切换到root身份才能 ...
- C语言tips_2 关于scanf 读取规则小结以及与getchar 的区别
第一点:scanf默认回车和空格是输入不同组之间的间隔和结束符号. 也就是说他不会读取 空格 和 换行符.而是把他们当作一个 数据被读取完成的标志!他的停止标志则为,当%d之类的数据输入结束之后,自动 ...
- systemctl daemon-reload
systemctl daemon-reload: 重新加载某个服务的配置文件,如果新安装了一个服务,归属于 systemctl 管理,要是新服务的服务程序配置文件生效,需重新加载. init 和 sy ...
- linux基本防护措施,权限分配和提高防护安全
设置用户失效 1.失效的用户将无法登录 使用chage命令将用户zhangsan的账户设为当前已失效(比如已经过去的某个时间): [root@proxy ~]# useradd zhangsan [r ...
- PCM-FTL
1. 运行时第一行需要是write 错误位置 trace_stat->sectors += length;
- POJ3259 Wormholes 【spfa判负环】
题目链接:http://poj.org/problem?id=3259 Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submis ...
- Holy Grail【spfa求最短路】
题目链接:https://www.jisuanke.com/contest/3004?view=challenges 题目大意: 1.一个无向图,给出六个顶点,添六条边,但是添边是有限制的.每次添边的 ...