Netty實現簡易聊天室的功能

使用Netty來實現一個聊天室是很容易的,當有客戶端連接服務端的時候,在服務端的channelActive方法裏面即可感應到。使用ChannelGroup.writeAndFlush方法即可向所有客戶端發送一條“上線了”的信息,ChannelGroup是Netty封裝的ConcurrentHashMap,裏面保存所有的客戶端:

同理,channelInactive是該客戶端斷開服務端時會回調的方法,在裏面給其他客戶端發一條“下線了”的信息。

客戶端通過channel.writeAndFlush即可向服務端發送信息,服務端通過channelRead方法即可感知到,然後把這條信息通過ChannelGroup發送給其他客戶端即可:

需要注意的是,TCP會有粘包拆包的現象發生,需要進行特殊處理。這裏的解決方案是發送每條數據的時候,將數據的長度一併發送,比如可以選擇每條數據的前4位是數據的長度,應用層處理時可以根據長度來判斷每條數據的開始和結束。

用一個Java類來保存發送的內容,如下所示:

自定義一個編碼器,發送數據的時候會經過它,將數據的長度和內容一塊發送出去:

然後寫一個自定義解碼器,數據到達服務端會首先經過解碼,然後到達業務Handler:

如果數據長度不夠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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章