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


小平岛象鼻山~

微信公众号


王皓的GitHub:https://github.com/TenaciousDWang
最近比较忙,虽然没人看,但下班后忙里偷闲坚持写写,就是个笔记,记录一下学习的过程。
在上一篇文章中我们实现了群聊的创建功能,今天我们继续来完善群聊的管理功能,第一个是加入群聊功能,第二个是退出群聊功能,最后一个是显示群聊成员列表功能。
群聊的加入,创建一个加入群聊指令,再根据我们之前的代码重构,添加一个控制台指令处理器。


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

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

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

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

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


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


consoleCommandMap.put("listGroupMembers", new ListGroupMembersConsoleCommand());注册对应指令。
我们为服务端添加处理获取群聊成员列表指令的处理器,首先获取群聊的ID,获得该群聊的channelGroup,遍历里面的channel,将每一个channel的session信息保存到一个容器里写入响应数据包返回给客户端展示。
响应数据包结构为:

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

最后我们来实现群聊得功能,客户端发送消息及群聊ID,服务端收到数据包后,根据群聊ID获取channelGroup,将消息写入即可。
这里我们首先创建一个群聊发送信息的数据包。

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

consoleCommandMap.put("sendToGroup", new SendToGroupConsoleCommand());注册对应指令。
服务端添加处理器来处理群聊消息数据包。

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

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

今天我们实现了群聊的管理功能及聊天功能,加入群聊,退出群聊,获取群聊成员列表。

本文详细介绍了在即时通讯应用中实现群聊管理功能的方法,包括加入群聊、退出群聊、获取群成员列表以及群聊消息发送的完整流程。
580

被折叠的 条评论
为什么被折叠?



