Netty实现聊天室

二、Netty实现聊天室

目标是实现一个一对多的聊天平台,需要的无非是一个服务器和一个客户端。

服务器的思路:

  1. 首先创建异步事件循环组,绑定端口
  2. 创建初始化类,进行channel过滤操作
  3. 过滤时候写一个处理器,使Client实现一对多

启动程序和过滤操作和之前都是一样的,可以参考上一篇文章
https://blog.csdn.net/weixin_44240370/article/details/100945281

主要是来说一下Handler的实现:
在这里插入图片描述
继承SimpleChannelInboundHandler但是也可以继承ChannelInboundHandlerAdapter,这是一个简单的适配器模式。

  1. 首先先把框架打好,一个简单的Handler,一个错误打印和服务器关闭
@Override
    protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
    }
    //异常发生
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();
    }

接下来要实现的是,一个Client的上线会通知给其他Client并将消息会进行广播。

  1. 会有很多Client注册进来,所以会产生很多channel,要进行广播的话就要把channel放进一个组里,也是借用netty的一个实现。
    在这里插入图片描述

下面主要来说一下具体要实现的功能:

  • 首先Client连接到Server,连接之后立刻触发回调函数,表示服务器正常
    在这里插入图片描述

  • 连接失败,Server端出现问题,触发回调函数
    在这里插入图片描述

  • 有人上线,触发回调函数
    在这里插入图片描述

  • 有人下线
    在这里插入图片描述

  • 当客户端有信息经由服务端去转发的时候,我们要保证,这个信息可以广播到所有其他的ip,除了自己的,那么就需要对channels进行遍历,然后进行一下筛选,再处理。
    在这里插入图片描述
    服务端实现之后,接下来要写客户端,客户端要比服务端简单很多。

  • Client的启动类和初始化都是和之前一样的只需要完善一下读取控制台输入的信息,然后放进channel组里面去写出就OK。
    在这里插入图片描述
    但是这样做还有一个缺陷:如果客户端异常退出,而不是正常点击下线的话,无法触发handlerRemoved操作,所以需要手写一个类似于zk的心跳包去send each other来确定是否还在线:
    操作需要在Server Handler上去改正:

  • 首先新添加一个过滤器,将被判定为离线的人的消息进行过滤
    在这里插入图片描述

  • 重写一个回调方法,当一个事件触发以上三种超时之后采取的措施是什么
    在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值