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连接传送的数据,无差错,不丢失 ...
随机推荐
- c++自定义数组越异常 ArrayIndexOutOfBoundsException (学习)
#include <iostream> using namespace std; const int DefaultSize = 10; class Array{public: Array ...
- 动手生成 Delphi xe DBTreeview 三级行政图树 省市县
表结构及记录 object tarea: TFDQuery Connection = FDConnection1 SQL.Strings = ( 'select *' ...
- Android学习笔记之View
转载: 0.7562018.10.22 21:44:10字数 5,423阅读 189 导图 一.View事件体系 1.什么是 View 和 View的位置坐标 View是什么: View 是一种界 ...
- PowerShell ISE/文件名解析缺陷远程执行代码漏洞#RCE
基础信息 ID 1337DAY-ID- 32642 类型 zdt Reporter hyp3rlinx 修改后的 2019-05-03 00:00:00 描述 在调试包含数组括号作为文件名一部分的特制 ...
- python基础----redis模块
数据库 关系型数据 例如mysql,有表还有约束条件等 非关系型 k-v形式 memcache 存在内存中 redis 存在内存 mongodb 数据存在磁盘 import redis #string ...
- selenium+python自动化框架
流程: 环境准备 eclipse :需安装pydev.testng插件 python :安装python完成后,需 pip下安装selenium:命令: pip install selenium 我现 ...
- Python-OpenCV实现二值图像孔洞填充
代码如下: import cv2 import numpy as np def FillHole(mask): contours, hierarchy = cv2.findContours(mask, ...
- 《精通并发与Netty》学习笔记(13 - 解决TCP粘包拆包(一)概念及实例演示)
一.粘包/拆包概念 TCP是一个“流”协议,所谓流,就是没有界限的一长串二进制数据.TCP作为传输层协议并不不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行数据包的划分,所以在业务上认 ...
- 最新 58集团java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.58集团等10家互联网公司的校招Offer,因为某些自身原因最终选择了58集团.6.7月主要是做系统复习.项目复盘.Leet ...
- es6学习笔记(一)环境搭建
1.安装node.js.这个自行百度安装就好了,没什么说的,安装完配置环境变量.因为后面安装第三方包是要用到npm命令,装完node就等于安装完了npm 2.项目目录创建 mkdir es6 cd e ...