目标是实现一个一对多的聊天平台,需要的无非是一个服务器和一个客户端。
服务器的思路:
启动程序和过滤操作和之前都是一样的,可以参考上一篇文章
https://blog.csdn.net/weixin_44240370/article/details/100945281
主要是来说一下Handler的实现:
继承SimpleChannelInboundHandler但是也可以继承ChannelInboundHandlerAdapter,这是一个简单的适配器模式。
@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并将消息会进行广播。
下面主要来说一下具体要实现的功能:
当客户端有信息经由服务端去转发的时候,我们要保证,这个信息可以广播到所有其他的ip,除了自己的,那么就需要对channels进行遍历,然后进行一下筛选,再处理。
服务端实现之后,接下来要写客户端,客户端要比服务端简单很多。
Client的启动类和初始化都是和之前一样的只需要完善一下读取控制台输入的信息,然后放进channel组里面去写出就OK。
但是这样做还有一个缺陷:如果客户端异常退出,而不是正常点击下线的话,无法触发handlerRemoved操作,所以需要手写一个类似于zk的心跳包去send each other来确定是否还在线:
操作需要在Server Handler上去改正:
首先新添加一个过滤器,将被判定为离线的人的消息进行过滤