说明文档
设计思路
- 采用c/s架构,包括服务端、客户端。
- 用户操作,均在命令行中进行。
- 网络协议
- 传输协议采用了TCP协议
- 应用协议由字符判断识别
- 客户端,拥有收发消息功能。分别由两个goroutine协程进行处理。
- 服务端,拥有多个goroutine协程,如下:
- 接收tcp连接协程
- 无限循环接收客户端的连接请求
- 连接成功后的用户处理协程
- 处理客户端发送的所有请求,(例如:发消息、创建聊天室、GM指令等
- 消息广播协程
- 私聊消息协程
- 流行词协程
- 定时清理过期的流行词
- 接收tcp连接协程
关键算法
- 屏蔽字检测
- 采用的字典树结构
- 原理:
- 节点结构:{node:{isEnd: false, nextNode: NODE}}
- 初始化字典树,将所有屏蔽词依次放入字典树中
- 检测字符串,例如:”abc“
- 首先检索树根下是否存在字符 a 节点
- 若有,再依次检索b、c
- 最终只检索到了a、b两个节点时,判断b节点的isEnd标识是否真,若为真则“abc” 字符中“ab”是屏蔽字,替换为“**c"
- 优点:共享公共的前缀,占用空间少
部署
服务器端
- 安装golang环境
- 编译server.go文件
- 命令:
go build server.go
- 命令:
- 启动server.exe程序
- 命令:
server.exe -add 127.0.0.1:12312
客户端
- 安装golang环境
- 编译client.go文件
- 命令:
go build client.go
- 命令:
- 启动client.exe程序
- 命令:
client.exe -add 127.0.0.1:12312 -u USERNAME
- 命令:
使用说明
- 登录程序
- 命令:
client.exe -add ADD -u USERNAME
- ADD: 服务器监听地址;
- USERNAME: 用户名称;
- 命令:
- 退出程序
- 命令:
quit
- 命令:
- 创建聊天室
- 命令:
add#GROUPNAME=USERNAME1+USERNAME2
- GROUPNAME: 聊天室名称
- USERNAME1: 加入聊天室的用户1
- USERNAME2: 加入聊天室的用户2
- 命令:
- 加入聊天室
- 命令:
add#GROUPNAME=USERNAME3+USERNAME4
- 表示用户3和用户4加入GROUPNAME聊天室
- 命令:
- 发送消息至聊天室
- 命令:
*GROUPNAME MESSAGE
- GROUPNAME: 聊天室名称
- MESSAGE: 消息内容
- 注意:
- 命令第一个字符是星号
- GOURPNAME字段后有一个空格
- 命令:
- 发送消息至好友
- 命令:
@USERNAME MESSAGE
- USERNAME:用户名称
- MESSAGE:消息内容
- 命令:
- GM指令
- 获取流行词
- 命令:
/popular N
- 打印出最近N秒内发送频率最高的词,N小于等于60
- 命令:
- 获取用户在线时长
- 命令:
/stats USERNAME
- 打印出USERNAME用户在线时长。
- 时间格式:00d 00h 00m 00s
- 命令:
- 获取流行词
单元测试
使用golang原始的 test单元测试。
测试部分:
1. 屏蔽字
2. 高频词汇
3. 在线时长获取
4. 不同类型消息内容的拼接
第三方库
未使用第三方库