这是一个使用 Go 语言实现的实时聊天室系统,具有用户管理、消息广播、活跃度排行榜等功能。该系统采用 TCP 协议进行通信,并使用 Redis 存储用户活跃度数据。
- 用户管理:用户通过输入用户名加入聊天室,支持唯一用户名验证
- 实时消息广播:所有用户可以在聊天室中实时交流
- 活跃度排行榜:基于 Redis 实现的用户活跃度统计和排行功能
- 日志系统:完整的日志记录,管理员可查看用户的进入、退出和聊天情况
- 安全退出:用户输入
exit可以安全退出聊天室 - 面向对象设计:采用面向对象的设计思想,代码结构清晰
- 防粘包处理:自定义协议解决 TCP 通信中的粘包问题
- 客户端 (client):处理用户输入和显示聊天消息
- 服务端 (server):处理客户端连接、消息广播和用户管理
- 协议层 (proto):自定义通信协议,解决 TCP 粘包问题
- 数据存储:使用 Redis 存储用户活跃度数据
- 语言:Go 1.22
- 网络通信:TCP Socket
- 数据存储:Redis
- 日志系统:logrus
- 并发控制:goroutine 和 channel
- 安装 Go 1.22 或更高版本
- 安装并启动 Redis 服务
go mod tidygo run server/server.gogo run client/client.go- 输入用户名加入聊天室(用户名不能为空且不能重复)
- 输入消息内容发送消息(消息不能为空)
- 输入
all查看活跃度排行榜 - 输入
exit安全退出聊天室
top10:查看排名前十的用户all:查看所有用户的排行榜rank <用户名>:查看指定用户的排名del <用户名>:删除指定用户的排名数据
系统使用 Redis 存储用户活跃度数据和消息流。默认配置如下:
rdb = redis.NewClient(&redis.Options{
Addr: "182.42.110.229:6379",
Password: "xiaomu@303",
DB: 0,
})注意:在实际部署时,请根据您的 Redis 服务配置修改以上参数。
Chat-room/
├── client/
│ └── client.go # 客户端实现
├── server/
│ └── server.go # 服务端实现
├── proto/
│ └── proto.go # 通信协议实现
├── go.mod # Go 模块定义
├── go.sum # 依赖版本锁定
├── server.log # 服务端日志
└── README.md # 项目说明文档
为解决 TCP 通信中的粘包问题,系统实现了自定义的通信协议:
- 消息头:4 字节,表示消息体的长度
- 消息体:实际的消息内容
- 基础聊天室功能实现
- 面向对象改造,优化代码结构
- 添加 Redis 活跃度排行榜功能
- 解决客户端查看活跃度排行榜带来的粘包问题
- 服务端默认监听 8081 端口,请确保该端口未被占用
- 确保 Redis 服务正常运行且配置正确
- 日志文件保存在项目根目录下的 server.log 中