一个基于 TCP 协议开发的即时通讯聊天应用,支持用户注册登录、实时消息收发、在线用户列表、历史消息等功能。
- Go 1.24.3
- MySQL - 用户数据持久化存储
- Redis - 消息流 (Redis Stream) 实现
- 用户注册与登录
- 实时消息发送与接收
- 在线用户列表查询
- 消息历史记录 (基于 Redis Stream)
- 心跳保活机制
- 用户超时自动下线
- 系统通知 (用户上线/下线)
Chat/
├── client/ # 客户端代码
│ ├── client.go # 客户端主程序
│ └── clitool/ # 客户端工具模块
├── server/ # 服务端代码
│ ├── main.go # 服务端主程序
│ ├── sertool/ # 服务端工具模块
│ └── ConnectManager/ # 连接管理模块
│ ├── Manage.go # 连接管理器
│ ├── Connection.go
│ ├── Message.go
│ └── Msg.go
├── db/ # 数据库模块
│ ├── db.go # MySQL 操作
│ ├── redisdb.go # Redis 连接
│ └── redisStream.go # Redis Stream 操作
├── go.mod
└── README.md
- Go 1.24.3+
- MySQL (运行在 localhost:3306)
- Redis (运行在 localhost:6379)
创建 MySQL 数据库和用户表:
CREATE DATABASE tcp;
USE tcp;
CREATE TABLE user (
id INT AUTO_INCREMENT PRIMARY KEY,
password VARCHAR(255) NOT NULL,
name VARCHAR(255) NOT NULL UNIQUE,
Last_Message VARCHAR(255) DEFAULT ''
);根据实际情况修改数据库连接配置:
- MySQL:
db/db.go第 20 行 - Redis:
db/redisdb.go(默认 localhost:6379)
cd server
go run main.go服务端将监听 0.0.0.0:8080
cd client
go run client.go- 选择模式: 输入
1注册 或2登录 - 输入用户名和密码
- 发送消息: 输入消息后回车发送
| 命令 | 说明 |
|---|---|
/list |
查看在线用户列表 |
/PAI |
查看活跃度排名 |
/exit |
退出客户端 |
- 发送给所有人: 直接输入消息内容
- 私聊: 输入
@用户名:消息内容
- ConnectManager: 管理所有客户端连接
- 添加/移除用户
- 消息广播
- 超时检测
- 历史消息处理
- 客户端连接服务器并完成登录
- 客户端发送消息到服务器
- 服务器将消息写入 Redis Stream
- 服务器从 Stream 消费消息并广播给所有在线用户
- 客户端接收并显示消息
- 心跳间隔默认 10 秒
- 用户超时默认检测间隔
- 首次登录从最新消息开始读取历史
MIT