前言
在线聊天室2.0版本
在之前的博文的基础上,更换BIO的socket通信为NIO的Netty框架,添加新功能,整合管理端和用户端。
基本功能
- 相较与前一版:
- 添加启动时连接失败,进行有限次重连的操作。(客户端)
- 还有监控连接是否异常中断,进行有限次断线重连操作。(客户端)
- 服务端对客户端进行的心跳检测机制。(服务端与客户端)
- 再则把管理端和服务端的的界面分离出来,使用策略模式,统一一个登录界面,根据是否成功输入管理员秘钥(默认为“HCODE”),负责生成不同的客户端界面(分为管理员和普通用户)。
- 继承前一版:
- 管理端
1)管理员设置聊天室IP,端口号,管理员昵称,连接服务器进入聊天室或退出聊天室。
2)系统消息日志记录,管理员可发布系统消息给各在线用户。
3)管理员在线与聊天室在线用户进行群聊。
4)管理员可对在线用户列表中指定用户进行私聊请求,对方同意即可开始私聊。
5)管理员可对在线用户列表中指定用户进行踢出聊天室操作,并通知其他人。
- 普通用户端
1)用户设置聊天室IP,端口号,用户昵称,连接服务器进入聊天室或退出聊天室。
2)系统消息通知,接受服务器端发布的消息,以及用户一些操作。
3)用户可与其他在线用户进行群聊。
4)用户可与指定用户列表中其他在线用户进行私聊请求,同意即可开始私聊。
5)用户可以屏蔽指定用户列表中的用户的群聊发言,屏蔽后即接受不到对方发言, 同时也可以选择取消屏蔽。
传输的协议说明
public class MsgModel implements Serializable {
private byte type; // 权限信息标志
private byte code; // 命令符
private String body; // 消息主体
}
- type: 权限信息标志 (参数含义)
- 管理员特权消息
- 用户或管理员消息
- 系统消息(客户端处理)
-
code: 命令符(参数含义)
- 0.上线消息 1. 群聊 2. 私聊 3. 屏蔽某人 4. 取消屏蔽 5. 踢出某人
- 6.系统通知 7. 管理员发布通知 8. 心跳检测 9. 发送在线用户列表给客户端
- 10. 新用户加入 11. 用户退出 110. 权限认证 -
body:具体消息主体(code参数与之对应的格式)
1.群聊的body格式
客户端发送: <id>${socketChannel.id}</id><msg>${msg}</msg>
服务端发送: <id>${socketChannel.id}</id><name>${name}</name><msg>${msg}</msg><time>${time}</time>
2.私聊的body格式为
客户端发送:<id>${socketChannel.id}</id><order>{orderNum}</order><msg>${msg}</msg>
当order为1,msg为start
当order为1,msg为exit
服务端发送:<id>${socketChannel.id}</id><order>${orderNum}</order><msg>${msg}</msg><time>${time}</time>
orderNum---> 1.发起私聊 2.结束私聊 3.普通私聊信息 4.对方已离线,关闭私聊窗口
3 4.屏蔽或取消屏蔽的body格式为
客户端发送:<me>${myId}</me><other>${shieldId}</other>
5.管理员踢人指令body格式:
客户端发送:发生所选用户的id
服务端发送:<admin>${socketChannel.id}</admin><kick>${beKick.id}</kick><time>${time}</time>
6.系统通知消息的body格式为:
<msg>${msg}</msg><time>${time}</time>
7.管理员发布系统消息body格式:
<id>${socketChannel.id}</id><msg>${msg}</msg><time>${time}</time>
8.心跳事件body格式:
客户端发送:"a ‘ping’ beat heart from"+ctx.channel().remoteAddress() //后面为该用户端所在的ip和端口号
服务端:只进行心跳检测,客户端在心跳检测事件内有发送信息让服务端读到,则说明该用户还存活,否则关闭通道。
9.用户列表 由服务器端查询在线用户发送给新加入的用户
body格式为:
<user><id>${socketChannel.id}</id><name>${name}</name><authority>${admin or user}</authority></user>
注:每个用户的信息都如上,然后列表有多个用户信息拼接而成。
10 11.用户进入与退出的消息body格式:
<id>${socketChannel.id}</id><name>${name}</name><authority>${authority}</authority><time>${time}</time>
110.权限认证消息的body格式:
客户端发送:管理员认证密钥HCODE即可行驶管理员权力。
界面演示
-
可选以普通用户或者管理员身份登录,管理员权限密令默认为:HCODE
-
普通用户
-
管理员
-
私聊窗口
-
启动时连接失败,进行有限次重连
-
断线重连