Netty进阶 -- 非阻塞网络编程 实现群聊+私聊+心跳检测系统

❤️❤️❤️ 感谢各位大可爱小可爱! ❤️❤️❤️

文章目录

  • Netty系列文章

  • 一、需求说明

  • 二、什么是心跳检测机制?

    • ❤️Netty实现心跳检测机制
  • 三、需求分析

    • 🚝多人群聊

    • 🚝单人私聊

    • 🚝服务器检测用户上线、离线

  • 四、效果图

  • 五、核心源码

  • 往期精彩热文回顾

  • ⛲小结

Netty系列文章

============================================================================

Netty入门 – 什么是Netty?

一、需求说明

=========================================================================

使用Netty实现群聊+私聊系统

  1. 编写一个Netty群聊系统,实现服务器端和客户端之间的数据简单通讯(非阻塞形式)

  2. 实现多人群聊

  3. 实现单人私聊

  4. 利用心跳检测机制监听客户端是否存在连接(是否存在读、写、读写操作

  5. 服务器端:可以检测用户上线,离线,并且实现消息转发功能

  6. 客户端:通过channel可以无阻塞发送消息给其它所有在线用户,同时可以接受所有在线用户发送的消息(由服务器转发消息得到

二、什么是心跳检测机制?

===============================================================================

心跳检测机制就是在一定的时间范围内客户端与服务器之间没有发生读、写、读写操作,那么就认定客户端与服务器无连接,这样就节省了服务器的资源

❤️Netty实现心跳检测机制


服务器启动前添加前置处理器


//添加心跳检测

pipeline.addLast(new IdleStateHandler(3, 5, 7, TimeUnit.SECONDS));



//添加自定义心跳处理器

pipeline.addLast(new HeartbeatServerHandler());



IdleStateHandler是Netty 提供的处理空闲状态的处理器

参数说明


// long readerIdleTime: 表示多长时间没有读,就会发送一个心跳检测包,检测是否还处于连接状态

// long writerIdleTime: 表示多长时间没有写,就会发送一个心跳检测包,检测是否还处于连接状态

// long allIdleTime:    表示多长时间没有读写操作,就会发送一个心跳检测包,检测是否处于连接状态

// 最后一个参数是当前时间的单位,秒或分钟或小时。



源码表示当前处理器类是表示多长时间内没有读、没有写、或者没有读写操作,就会触发IdleStateEvent事件

Triggers an IdleStateEvent when a Channel has not performed read, write, or both operation for a while.

IdleStateEvent事件 触发后, 就会传递给管道的下一个handler处理

通过调用(触发)handleruserEventTiggered 在该方法中处理 当IdleStateEvent事件

HeartbeatServerHandler自定义心跳处理器


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;

                ca
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值