Netty实现简易聊天室的功能

使用Netty来实现一个聊天室是很容易的,当有客户端连接服务端的时候,在服务端的channelActive方法里面即可感应到。使用ChannelGroup.writeAndFlush方法即可向所有客户端发送一条“上线了”的信息,ChannelGroup是Netty封装的ConcurrentHashMap,里面保存所有的客户端:

Netty实现简易聊天室的功能_第1张图片

同理,channelInactive是该客户端断开服务端时会回调的方法,在里面给其他客户端发一条“下线了”的信息即可。

客户端通过channel.writeAndFlush即可向服务端发送信息,服务端通过channelRead方法即可感知到,然后把这条信息通过ChannelGroup发送给其他客户端即可:

Netty实现简易聊天室的功能_第2张图片

需要注意的是,TCP会有粘包拆包的现象发生,需要进行特殊处理。这里的解决方案是发送每条数据的时候,将数据的长度一并发送,比如可以选择每条数据的前4位是数据的长度,应用层处理时可以根据长度来判断每条数据的开始和结束。

用一个Java类来保存发送的内容,如下所示:

Netty实现简易聊天室的功能_第3张图片

自定义一个编码器,发送数据的时候会经过它,将数据的长度和内容一块发送出去:

Netty实现简易聊天室的功能_第4张图片

然后写一个自定义解码器,数据到达服务端会首先经过解码,然后到达业务Handler:

Netty实现简易聊天室的功能_第5张图片

如果数据长度不够length,就等待下一次数据过来,取数据的时候也只取length长度的数据。

完整的运行效果如下所示:

Server:

聊天室server启动。。。
/127.0.0.1:63069 上线了
/127.0.0.1:63123 上线了
/127.0.0.1:63123 下线了
当前客户端数量:1

Client1:

==========/127.0.0.1:63069==========
[ 客户端 /127.0.0.1:63123 ] 上线了 2020-05-05 21:59:56
123
[ 自己 ] 发送了消息:123
[ 客户端 /127.0.0.1:63123 ] 发送了消息:456
[ 客户端 /127.0.0.1:63123 ] 下线了

Client2:

==========/127.0.0.1:63123==========
[ 客户端 /127.0.0.1:63069 ] 发送了消息:123
456
[ 自己 ] 发送了消息:456

Process finished with exit code -1

GitHub源码:https://github.com/MonkeyOneCool/netty-chatroom

你可能感兴趣的:(Netty,Netty)