Group chat management&chat_java

2016年冬天在大连小平岛,罕见零下22摄氏度,看到海面上冒烟,像温泉,但是冰冷刺骨,大傻鸥抗冻。

Group chat management&chat_java_02

Group chat management&chat_java_03

小平岛象鼻山~

Group chat management&chat_java_04

Group chat management&chat_java_05

王皓的GitHub:https://github.com/TenaciousDWang

 

        最近比较忙,虽然没人看,但下班后忙里偷闲坚持写写,就是个笔记,记录一下学习的过程。

        

         在上一篇文章中我们实现了群聊的创建功能,今天我们继续来完善群聊的管理功能,第一个是加入群聊功能,第二个是退出群聊功能,最后一个是显示群聊成员列表功能。


         群聊的加入,创建一个加入群聊指令,再根据我们之前的代码重构,添加一个控制台指令处理器。


Group chat management&chat_java_06

        

Group chat management&chat_java_07


        并在控制台处理器管理类中添加指令对应。


Group chat management&chat_java_08


        客户端准备完毕,我们来为服务端添加一个加入群聊请求处理器JoinGroupRequestHandler继承SimpleChannelInboundHandler<JoinGroupRequestPacket>,重写channelRead0方法来应对JoinGroupRequestPacket数据包的处理。


Group chat management&chat_java_09


        JoinGroupRequestHandler拿到数据包后,读取到群聊ID,从群组容器中找到该群组的channelGroup,将当前发送申请用户的channel放进去,然后创建加群响应JoinGroupResponsePacket发送至客户端。


Group chat management&chat_java_10


        客户端创建处理JoinGroupResponsePacket数据包的Handler来将响应打印到控制台。


Group chat management&chat_java_11

Group chat management&chat_java_12


        接下来我们来实现群聊的退出,退出基本与加入一样,只不过是一个逆向操作,需要将当前提交用户的channel从退出群聊的channelGroup中移除即可,响应同上,这里只贴出关键代码。


Group chat management&chat_java_13

Group chat management&chat_java_14


            接下来我们实现获取群成员列表的功能,首先现在客户端添加控制台处理器,创建群聊成员列表数据指令包。


Group chat management&chat_java_15


Group chat management&chat_java_16


    consoleCommandMap.put("listGroupMembers", new ListGroupMembersConsoleCommand());注册对应指令。


        我们为服务端添加处理获取群聊成员列表指令的处理器,首先获取群聊的ID,获得该群聊的channelGroup,遍历里面的channel,将每一个channel的session信息保存到一个容器里写入响应数据包返回给客户端展示。


Group chat management&chat_java_17


        响应数据包结构为:


Group chat management&chat_java_09


        我们在客户端添加一个ListGroupMembersResponseHandler来将返回的数据包内群聊成员信息打印到控制台即可。



        最后我们来实现群聊得功能,客户端发送消息及群聊ID,服务端收到数据包后,根据群聊ID获取channelGroup,将消息写入即可。


        这里我们首先创建一个群聊发送信息的数据包。


Group chat management&chat_java_19


        添加一个发送群聊消息的控制台处理器。


Group chat management&chat_java_20


        consoleCommandMap.put("sendToGroup", new SendToGroupConsoleCommand());注册对应指令。


        服务端添加处理器来处理群聊消息数据包。


Group chat management&chat_java_21


        创建GroupMessageResponsePacket群消息响应数据包写入群聊channelGroup中。


Group chat management&chat_java_22


        客户端添加接收并处理群聊消息的Handler,打印到控制台即可。


Group chat management&chat_java_23