一、前言
Java中直接使用socket进行通信的场景应该不是很多,在公司的一个项目中有这种需求,所以根据自己的理解和相关资料的参考,基于NIO 实现了一组工具类库,具体的协议还未定义,后续再整理
二、实现思路
包结构如下:
Listener: 事件监听接口
AcceptListener(请求事件接口),TCPServerProtocol实现类中当服务端接收到连接请求并成功建立通信之后通知注册的此事件集合;
ReadListener(读取事件接口),TCPProtocol实现类中读取接收到的信息完成之后通知注册的此事件集合;
SendListener(发送事件接口),TCPProtocol实现类中调用发送信息方法之后通知注册的此事件集合;
Protocol:TCP处理接口
TCPProtocol(读取、输出TCP处理接口),定义了NIO中关于输入、输出处理以及相关监听事件的维护
TCPServerProtocol(接收TCP请求处理接口),定义了NIO中TCP请求处理以及相关监听事件的维护
Util:辅助类
HelperUtil(一些基本操作工具类),定义获取KEY值,获取本地IP,核对结束帧等
SocketConfig(socket连接配置类),,定义IP地址、端口、处理接口、是否自动重置等配置信息
SocketStat(socket连接状态管理类),管理socket的生命周期,提供socket控制方法
SocketLogicException(socket异常类),定义此类库中可能出现的异常
Socket:对外服务类
NSocketBlockClient(socket阻塞客户端类),提供阻塞的客户端实现
NSocketClient(socket非阻塞客户端类),提供非阻塞的客户端实现
NSocketService(socket非阻塞服务端类),提供非阻塞的服务端实现
SelectOptionListener(发送事件接口的实现),用于改变selector的interestOps为OP_WRITE
SocketClientTask(客户端线程任务),用于管理客户端的输入、输出事件以及异常处理
SocketServiceTask(服务端线程任务),用于管理服务端的输入、输出、请求事件以及异常处理
核心类图:
三、使用方式
(1)通过实现AcceptListener、ReadListener、SendListener事件接口来注入发送、读取、接收业务
(2)通过设置SocketConfig对象属性来进行SOCKET通信配置
(3)通过NSocketBlockClient、NSocketClient、NSocketService对象来进行信息发送
服务端例子:
SocketConfig config=new SocketConfig(true, “10.33.6.178”, 8899);TCPServerProtocol protocol=new DefaultServerProtocol(new AcceptListener(){@Overridepublic void handleEvent(SocketStat socket) {socket.getConfig().getProtocol().addReadListener(new TestRead());}});NSocketService server=new NSocketService(config, protocol);细数门前落叶,倾听窗外雨声,