眼前多少难甘事,自古男儿当自强。这篇文章主要讲述Netty进阶 -- 非阻塞网络编程 实现群聊+私聊+心跳检测系统相关的知识,希望能为你提供帮助。
一、需求说明使用Netty实现群聊+私聊系统
- 编写一个Netty群聊系统,实现服务器端和客户端之间的数据简单通讯(非阻塞形式)
- 实现多人群聊
- 实现单人私聊
- 利用心跳检测机制监听客户端是否存在连接(是否存在读、写、读写操作)
- 服务器端:可以检测用户上线,离线,并且实现消息转发功能
- 客户端:通过channel可以无阻塞发送消息给其它所有在线用户,同时可以接受所有在线用户发送的消息(由服务器转发消息得到)
??Netty实现心跳检测机制服务器启动前添加前置处理器
//添加心跳检测
pipeline.addLast(new IdleStateHandler(3, 5, 7, TimeUnit.SECONDS));
//添加自定义心跳处理器
pipeline.addLast(new HeartbeatServerHandler());
IdleStateHandler是Netty 提供的处理空闲状态的处理器参数说明
// long readerIdleTime: 表示多长时间没有读,就会发送一个心跳检测包,检测是否还处于连接状态
// long writerIdleTime: 表示多长时间没有写,就会发送一个心跳检测包,检测是否还处于连接状态
// long allIdleTime:表示多长时间没有读写操作,就会发送一个心跳检测包,检测是否处于连接状态
// 最后一个参数是当前时间的单位,秒或分钟或小时。
源码表示当前处理器类是表示多长时间内没有读、没有写、或者没有读写操作,就会触发IdleStateEvent事件HeartbeatServerHandler自定义心跳处理器
Triggers an IdleStateEvent when a Channel has not performed read, write, or both operation for a while.
当IdleStateEvent事件 触发后, 就会传递给管道的下一个handler处理
通过调用(触发)handler的 userEventTiggered 在该方法中处理 当IdleStateEvent事件
public class HeartbeatServerHandler extends ChannelInboundHandlerAdapter
/**
* 客户端在指定时间内未触发相应操作执行此方法,即认为与客户端断开连接
* @param ctx全局上下文对象
* @param evt事件
* @throws Exception发生异常时抛出
*/
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception
//判断当前事件是否为IdleStateEvent
if (evt instanceof IdleStateEvent)
//将evt强转为IdleStateEvent
IdleStateEvent event = (IdleStateEvent) evt;
//判断到底发生的事件是什么
String eventType = null;
//由于IdleStateEvent底层判断事件是根据枚举类型来的,所以直接判断即可
switch (event.state())
case READER_IDLE:
eventType = "读空闲";
break;
case WRITER_IDLE:
eventType = "写空闲";
break;
case ALL_IDLE:
eventType = "读写空闲";
break;
System.out.println(ctx.channel().remoteAddress() + "发生超时事件,事件类型为:" + eventType);
System.out.println("服务器做相应处理");
【Netty进阶 -- 非阻塞网络编程 实现群聊+私聊+心跳检测系统】心跳检测机制就是这样,简单来说,就是每隔一段时间去检测客户端是否与服务器连接,如果无连接,那么就断开,从而节省服务器的资源
三、需求分析
推荐阅读
- 领域驱动设计 - 战术设计 - 3/3聚合与模型的构建方法
- MSTP+VRRP+静态路由+子网划分+DHCP实验案例
- ICDE 2022稀疏模型训练框架HybridBackend,单位成本下训练吞吐提升至5倍
- Redis cluster命令部署集群及数据导入
- Linux系列(if语句的使用(if thenelif thenelse fi))
- Linux系列(圆括号()(())$()的区别)
- Linux系列(让一个脚本同时只能运行一个(flock锁处理))
- Linux系列(查看网卡连接状态)
- Linux系列((CentOS 6)iptables的使用方法)