Skip to content

PengPengPeng717/chatroom

Repository files navigation

Go聊天室项目

Go Version License Build Status

一个基于Go语言开发的高性能多用户即时通讯聊天室系统,采用现代化的模块化架构设计,支持高并发、多用户实时聊天。

✨ 功能特性

🚀 核心功能

  • 多用户并发聊天 - 支持100+用户同时在线聊天
  • 实时消息广播 - 低延迟的消息传递机制
  • 用户上线/下线通知 - 自动通知所有用户状态变化
  • 在线用户查询 - 实时查看当前在线用户列表
  • 用户重命名 - 支持动态更改用户名
  • 私聊消息 - 支持用户间一对一私聊
  • 超时自动断开 - 智能的用户超时管理
  • 优雅退出机制 - 安全的连接关闭和资源清理

🔧 高级功能

  • 🔧 模块化架构设计 - 清晰的代码结构和职责分离
  • 🔧 配置管理系统 - 支持命令行参数和环境变量配置
  • 🔧 完善的日志系统 - 多级别日志记录和调试支持
  • 🔧 用户数量限制 - 可配置的最大用户数限制
  • 🔧 输入验证和清理 - 安全的用户输入处理
  • 🔧 系统统计信息 - 实时服务器状态监控
  • 🔧 时间显示功能 - 服务器时间查询
  • 🔧 帮助命令系统 - 内置命令帮助和说明
  • 🔧 Docker支持 - 完整的容器化部署方案
  • 🔧 健康检查 - 容器健康状态监控
  • 🔧 自动化构建 - Makefile自动化构建和测试

📁 项目结构

Chat_room_project/
├── 📄 main.go                    # 主程序入口,命令行参数处理
├── 📄 go.mod                     # Go模块依赖管理
├── 📄 go.sum                     # 依赖版本锁定文件
├── 📄 README.md                  # 项目说明文档
├── 📄 USAGE.md                   # 详细使用指南
├── 📄 Dockerfile                 # Docker容器化配置
├── 📄 docker-compose.yml         # Docker Compose编排文件
├── 📄 Makefile                   # 自动化构建脚本
├── 📄 .gitattributes             # Git属性配置
├── 📁 config/                    # 配置管理模块
│   └── 📄 config.go              # 配置结构体和环境变量处理
├── 📁 user/                      # 用户管理模块
│   └── 📄 user.go                # 用户结构体、用户管理器
├── 📁 message/                   # 消息处理模块
│   └── 📄 message.go             # 消息类型、命令解析器
├── 📁 handler/                   # 连接处理模块
│   └── 📄 handler.go             # 连接处理器、消息处理逻辑
├── 📁 server/                    # 服务器核心模块
│   └── 📄 server.go              # 服务器启动、生命周期管理
├── 📁 utils/                     # 工具函数模块
│   └── 📄 utils.go               # 日志记录器、工具函数
├── 📁 client/                    # 客户端程序
│   └── 📄 client.go              # 简单命令行客户端
├── 📁 test/                      # 测试程序
│   └── 📄 test.go                # 功能测试客户端
├── 📁 source/                    # 原始版本
│   └── 📄 chatroom.go            # 单文件版本(学习参考)
└── 📁 00-笔记/                   # 开发笔记和截图
    ├── 📄 day06-go4-聊天室.md    # 开发笔记
    └── 📁 assets/                # 项目截图和资源

🏗️ 架构设计

项目采用分层架构设计,各模块职责清晰:

  • 配置层 (config/) - 统一的配置管理和验证
  • 服务层 (server/) - 核心服务器逻辑和生命周期管理
  • 处理层 (handler/) - 连接处理和消息路由
  • 业务层 (user/, message/) - 用户管理和消息处理
  • 工具层 (utils/) - 通用工具和日志记录
  • 客户端 (client/, test/) - 客户端程序和测试工具

🚀 快速开始

📋 系统要求

  • Go版本: 1.21 或更高版本
  • 操作系统: Linux, macOS, Windows
  • 内存: 最少 64MB RAM
  • 网络: TCP连接支持

🔧 安装和编译

方法1: 使用Makefile(推荐)

# 克隆项目
git clone <repository-url>
cd Chat_room_project

# 安装依赖
make deps

# 构建所有程序
make build

# 运行服务器
make run

方法2: 手动编译

# 编译服务器
go build -o chatroom main.go

# 编译客户端
go build -o client client/client.go

# 编译测试程序
go build -o test test/test.go

🎯 启动服务器

基本启动

# 使用默认配置启动
./chatroom

# 或者使用make命令
make run

自定义配置启动

# 自定义配置启动
./chatroom -host 0.0.0.0 -port 9000 -max-users 50 -timeout 60

# 查看所有可用选项
./chatroom -help

后台运行

# 后台运行服务器
make run-daemon

# 停止服务器
make stop

🔌 连接客户端

方法1: 使用内置客户端

# 连接到服务器
./client 127.0.0.1 8080

# 或者使用make构建的客户端
./build/client 127.0.0.1 8080

方法2: 使用系统工具

# 使用telnet
telnet 127.0.0.1 8080

# 使用netcat
nc 127.0.0.1 8080

# 使用socat
socat - TCP:127.0.0.1:8080

方法3: 使用测试程序

# 运行自动化测试
make test

# 或者手动运行测试程序
./test

⚙️ 配置选项

🖥️ 命令行参数

参数 默认值 说明 示例
-host 127.0.0.1 服务器监听地址 -host 0.0.0.0
-port 8080 服务器监听端口 -port 9000
-max-users 100 最大用户数 -max-users 200
-timeout 40 用户超时时间(秒) -timeout 60
-help false 显示帮助信息 -help

🌍 环境变量

变量名 默认值 说明 示例
CHATROOM_HOST 127.0.0.1 服务器监听地址 export CHATROOM_HOST=0.0.0.0
CHATROOM_PORT 8080 服务器监听端口 export CHATROOM_PORT=9000
CHATROOM_MAX_USERS 100 最大用户数 export CHATROOM_MAX_USERS=200
CHATROOM_TIMEOUT 40 用户超时时间 export CHATROOM_TIMEOUT=60
CHATROOM_LOG_LEVEL INFO 日志级别 export CHATROOM_LOG_LEVEL=DEBUG

📝 配置示例

开发环境配置

# 开发环境 - 允许外部连接,调试日志
./chatroom -host 0.0.0.0 -port 8080 -max-users 50 -timeout 30

生产环境配置

# 生产环境 - 使用环境变量
export CHATROOM_HOST=0.0.0.0
export CHATROOM_PORT=8080
export CHATROOM_MAX_USERS=500
export CHATROOM_TIMEOUT=60
export CHATROOM_LOG_LEVEL=INFO

./chatroom

Docker环境配置

# 使用docker-compose启动
docker-compose up -d

# 或者使用环境变量启动容器
docker run -e CHATROOM_HOST=0.0.0.0 -e CHATROOM_PORT=8080 -p 8080:8080 chatroom

💬 用户命令

📋 命令列表

命令 简写 说明 示例
\help - 显示帮助信息 \help
\who - 查看在线用户列表 \who
\rename <新用户名> - 重命名 \rename 张三
\whisper <用户名> <消息> \w 发送私聊消息 \w 张三 你好
\time - 显示当前时间 \time
\stats - 显示聊天室统计信息 \stats
\quit - 退出聊天室 \quit
\exit - 退出聊天室 \exit

🎯 命令详解

基础聊天

# 发送普通消息(不需要命令前缀)
Hello, everyone!          # 发送给所有用户

用户管理

# 查看在线用户
\who
# 输出示例:
# 当前在线用户 (3人):
# - 张三 (ID: user_192.168.1.100_1640995200, 在线时长: 5分30秒)
# - 李四 (ID: user_192.168.1.101_1640995201, 在线时长: 2分15秒)

# 重命名
\rename 新昵称
# 输出示例:
# 用户名已更改为: 新昵称

私聊功能

# 发送私聊消息
\whisper 张三 你好,这是私聊消息
# 或者使用简写
\w 张三 你好,这是私聊消息

# 接收方会看到:
# [私聊] 李四 -> 张三: 你好,这是私聊消息

# 发送方会看到确认:
# [私聊] -> 张三: 你好,这是私聊消息

系统信息

# 查看当前时间
\time
# 输出示例:
# 当前时间: 2024-01-15 14:30:25

# 查看统计信息
\stats
# 输出示例:
# 聊天室统计: 当前用户 3/100

帮助和退出

# 查看帮助
\help
# 输出示例:
# 可用命令:
#   \who          - 查看在线用户列表
#   \rename <name> - 重命名
#   \whisper <user> <msg> - 私聊消息
#   \time          - 显示当前时间
#   \stats         - 显示聊天室统计信息
#   \help          - 显示此帮助信息
#   \quit          - 退出聊天室
#   \exit          - 退出聊天室

# 退出聊天室
\quit
# 或者
\exit

🏗️ 技术架构

🎯 核心设计理念

  • 模块化设计 - 清晰的职责分离和松耦合
  • 高并发处理 - 基于Go协程的并发模型
  • 线程安全 - 使用互斥锁保护共享资源
  • 优雅关闭 - 完善的资源清理和信号处理
  • 可扩展性 - 易于添加新功能和模块

📦 模块化设计

配置管理模块 (config/)

  • 功能: 统一的配置管理和验证
  • 特性: 支持命令行参数和环境变量
  • 验证: 配置参数合法性检查
  • 默认值: 合理的默认配置

用户管理模块 (user/)

  • 功能: 线程安全的用户会话管理
  • 特性: 用户创建、删除、重命名、查询
  • 并发: 读写锁保护用户数据
  • 统计: 实时用户数量统计

消息处理模块 (message/)

  • 功能: 统一的消息格式和命令解析
  • 类型: 支持多种消息类型(聊天、系统、私聊等)
  • 解析: 智能命令解析和参数提取
  • 格式化: 统一的消息格式化输出

连接处理模块 (handler/)

  • 功能: 高效的连接生命周期管理
  • 特性: 连接建立、消息处理、超时管理
  • 并发: 每个连接独立的goroutine处理
  • 清理: 自动资源清理和连接关闭

服务器核心模块 (server/)

  • 功能: 可扩展的服务器架构
  • 特性: 服务器启动、停止、信号处理
  • 监控: 服务器状态监控和统计
  • 扩展: 易于添加新功能

⚡ 并发处理

Goroutine模型

// 每个客户端连接使用独立的goroutine
go handler.HandleConnection(conn)

// 消息写入使用独立的goroutine
go writeToClient(user, conn)

// 超时监控使用独立的goroutine
go watchTimeout(user, timeoutChan)

Channel通信

// 用户消息通道
type User struct {
    MsgChan  chan string  // 消息接收通道
    DoneChan chan bool    // 退出信号通道
}

// 全局消息广播通道
var message = make(chan string, 10)

线程安全

// 使用读写锁保护用户数据
type UserManager struct {
    users map[string]*User
    mutex sync.RWMutex
}

🛡️ 错误处理

分层错误处理

  • 网络层: 连接错误、超时处理
  • 业务层: 用户操作错误、命令解析错误
  • 系统层: 资源不足、配置错误

优雅恢复

  • 连接断开: 自动清理用户资源
  • 超时处理: 自动断开不活跃用户
  • 信号处理: 优雅关闭服务器

日志记录

  • 多级别: INFO、ERROR、DEBUG、WARN
  • 格式化: 时间戳、级别、消息内容
  • 可配置: 支持日志级别配置

🚀 性能特性

📊 性能指标

指标 数值 说明
并发用户 100+ 支持大量并发连接
消息延迟 < 10ms 低延迟消息传递
内存占用 < 64MB 优化的内存使用
CPU使用 < 5% 高效的CPU利用率
连接超时 可配置 智能超时管理

⚡ 性能优化

内存优化

  • 对象池: 重用消息对象,减少GC压力
  • 缓冲区: 合理的缓冲区大小设置
  • 及时清理: 自动清理不活跃用户资源

网络优化

  • 非阻塞IO: 使用Go的并发模型
  • 连接复用: 高效的连接管理
  • 消息批处理: 批量处理消息发送

并发优化

  • Goroutine池: 控制协程数量
  • Channel缓冲: 合理的通道缓冲区
  • 锁优化: 使用读写锁减少竞争

📈 扩展性

水平扩展

  • 负载均衡: 支持多实例部署
  • 集群模式: 可扩展为集群架构
  • 微服务: 模块化设计支持微服务拆分

垂直扩展

  • 资源监控: 实时监控系统资源
  • 动态配置: 支持运行时配置调整
  • 性能调优: 可配置的性能参数

🛠️ 开发说明

📦 依赖管理

Go模块管理

# 初始化模块
go mod init chatroom

# 添加依赖
go get github.com/fatih/color

# 整理依赖
go mod tidy

# 下载依赖
go mod download

# 验证依赖
go mod verify

依赖列表

  • 标准库: 仅使用Go标准库,无外部依赖
  • 版本要求: Go 1.21+
  • 兼容性: 支持主流操作系统

📝 代码规范

编码标准

  • Go官方规范: 遵循Go语言官方代码规范
  • 格式化: 使用gofmt自动格式化代码
  • 注释: 添加适当的注释和文档
  • 命名: 使用清晰的变量和函数命名

项目结构

  • 模块化设计: 清晰的职责分离
  • 包管理: 合理的包结构和导入
  • 接口设计: 简洁的接口定义

🔧 开发工具

推荐工具

# 代码格式化
gofmt -w .

# 代码检查
golangci-lint run

# 运行测试
go test ./...

# 性能测试
go test -bench=. ./...

# 代码覆盖率
go test -cover ./...

Makefile命令

# 格式化代码
make fmt

# 代码检查
make lint

# 运行测试
make test

# 单元测试
make test-unit

# 性能测试
make bench

# 代码覆盖率
make coverage

# 生成文档
make docs

🧪 测试

测试类型

  • 单元测试: 各模块独立测试
  • 集成测试: 模块间交互测试
  • 功能测试: 端到端功能测试
  • 性能测试: 并发和性能测试

测试命令

# 运行所有测试
make test

# 运行单元测试
make test-unit

# 运行性能测试
make bench

# 查看测试覆盖率
make coverage

测试示例

# 启动服务器
make run

# 在另一个终端运行测试
make test

# 查看测试结果
cat test.log

🐳 Docker部署

📦 容器化部署

使用Docker Compose(推荐)

# 启动服务
docker-compose up -d

# 查看日志
docker-compose logs -f chatroom

# 停止服务
docker-compose down

# 重启服务
docker-compose restart

使用Docker命令

# 构建镜像
docker build -t chatroom .

# 运行容器
docker run -d \
  --name chatroom \
  -p 8080:8080 \
  -e CHATROOM_HOST=0.0.0.0 \
  -e CHATROOM_PORT=8080 \
  -e CHATROOM_MAX_USERS=100 \
  chatroom

# 查看容器状态
docker ps

# 查看日志
docker logs -f chatroom

# 停止容器
docker stop chatroom

🔧 Docker配置

环境变量配置

# docker-compose.yml
environment:
  - CHATROOM_HOST=0.0.0.0
  - CHATROOM_PORT=8080
  - CHATROOM_MAX_USERS=100
  - CHATROOM_TIMEOUT=40
  - CHATROOM_LOG_LEVEL=INFO

健康检查

healthcheck:
  test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/health"]
  interval: 30s
  timeout: 10s
  retries: 3
  start_period: 40s

数据持久化

volumes:
  - ./logs:/app/logs
  - redis-data:/data

🚀 生产部署

🏭 生产环境部署

系统服务部署

# 创建系统用户
sudo useradd -r -s /bin/false chatroom

# 创建服务目录
sudo mkdir -p /opt/chatroom
sudo chown chatroom:chatroom /opt/chatroom

# 复制二进制文件
sudo cp chatroom /opt/chatroom/
sudo chmod +x /opt/chatroom/chatroom

# 创建systemd服务文件
sudo tee /etc/systemd/system/chatroom.service > /dev/null <<EOF
[Unit]
Description=Go Chatroom Server
After=network.target

[Service]
Type=simple
User=chatroom
Group=chatroom
WorkingDirectory=/opt/chatroom
ExecStart=/opt/chatroom/chatroom -host 0.0.0.0 -port 8080
Restart=always
RestartSec=5
Environment=CHATROOM_LOG_LEVEL=INFO

[Install]
WantedBy=multi-user.target
EOF

# 启动服务
sudo systemctl daemon-reload
sudo systemctl enable chatroom
sudo systemctl start chatroom

# 查看服务状态
sudo systemctl status chatroom

防火墙配置

# Ubuntu/Debian
sudo ufw allow 8080/tcp
sudo ufw reload

# CentOS/RHEL
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload

日志管理

# 配置logrotate
sudo tee /etc/logrotate.d/chatroom > /dev/null <<EOF
/opt/chatroom/logs/*.log {
    daily
    missingok
    rotate 30
    compress
    delaycompress
    notifempty
    create 644 chatroom chatroom
    postrotate
        systemctl reload chatroom
    endscript
}
EOF

📊 监控和运维

系统监控

# 监控服务状态
sudo systemctl status chatroom

# 查看服务日志
sudo journalctl -u chatroom -f

# 监控资源使用
top -p $(pgrep chatroom)
htop -p $(pgrep chatroom)

# 监控网络连接
netstat -an | grep 8080
ss -tuln | grep 8080

性能监控

# 监控内存使用
ps aux | grep chatroom

# 监控文件描述符
lsof -p $(pgrep chatroom)

# 监控网络流量
iftop -i eth0 -f "port 8080"

📈 扩展部署

负载均衡

# Nginx配置示例
upstream chatroom {
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
    server 127.0.0.1:8082;
}

server {
    listen 80;
    location / {
        proxy_pass http://chatroom;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

集群部署

# 启动多个实例
./chatroom -port 8080 &
./chatroom -port 8081 &
./chatroom -port 8082 &

# 使用负载均衡器分发请求

📚 更新日志

🚀 v2.0.0 (当前版本) - 2024-01-15

🔄 重大更新

  • 完全重构: 从单文件版本重构为模块化架构
  • 架构优化: 采用分层架构设计,职责清晰分离
  • 性能提升: 优化并发处理,支持更高并发用户

✨ 新功能

  • 配置管理: 支持命令行参数和环境变量配置
  • 私聊功能: 支持用户间一对一私聊消息
  • 系统统计: 实时显示聊天室统计信息
  • 时间显示: 服务器时间查询功能
  • 帮助系统: 内置命令帮助和说明
  • Docker支持: 完整的容器化部署方案
  • 健康检查: 容器健康状态监控
  • 自动化构建: Makefile自动化构建和测试

🔧 改进优化

  • 错误处理: 完善的错误处理机制和日志记录
  • 用户管理: 改进的用户管理机制和状态跟踪
  • 消息处理: 统一的消息格式和命令解析
  • 连接管理: 高效的连接生命周期管理
  • 资源清理: 自动资源清理和内存优化

🐛 Bug修复

  • 修复用户超时处理问题
  • 修复消息广播异常
  • 修复连接断开时的资源泄漏
  • 修复并发访问时的竞态条件

📦 v1.0.0 (原始版本) - 2024-01-01

✅ 基础功能

  • 基础聊天: 多用户实时聊天功能
  • 用户管理: 用户上线/下线管理
  • 消息广播: 消息实时广播给所有用户
  • 超时处理: 用户超时自动断开机制
  • 命令系统: 基础命令支持(who、rename等)

About

A simple chat room function was implemented using the go language

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published