一个基于 C 语言开发的支持多用户实时协作的绘画与聊天应用。
- 用户系统: 注册、登录认证
- 绘画功能: 自由画笔、橡皮擦、撤销/重做、画布清理
- 协作功能: 多用户实时同步绘画、实时聊天室
- 项目管理: 创建/加入房间、项目列表管理
- 数据持久化: MySQL 数据库存储用户信息和画布状态
- 本地存储: 支持画布数据本地保存/加载
| 组件 | 技术 |
|---|---|
| 语言 | C (C17) |
| GUI | GTK 3 |
| 图形库 | Cairo |
| 网络 | WebSocket (自定义实现) |
| 数据交互 | cJSON |
| 数据库 | MySQL 8.x |
| 构建系统 | Make |
Canvas/
├── deps/ # 第三方依赖
│ └── cJSON/ # JSON 解析库
├── include/ # 头文件
├── src/
│ ├── client/ # 客户端代码 (GUI + 网络客户端)
│ ├── server/ # 服务端代码
│ ├── common/ # 公共代码 (画布、数据库、撤销重做)
│ └── protocol/ # 协议编解码
├── tests/ # 单元测试
├── Makefile # 构建脚本
└── schema.sql # 数据库架构
- GCC (支持 C17)
- GTK 3 开发库
- MySQL 8.x 开发库
- Make
sudo apt update
sudo apt install libgtk-3-dev libmysqlclient-dev build-essentialmake clean && make# 登录 MySQL
mysql -u root -p
# 执行数据库脚本
source schema.sql# 启动服务端
./build/bin/canvas_server
# 启动客户端 (另一个终端)
./build/bin/canvas_client- 注册/登录: 首次使用需要注册账号,然后登录
- 选择房间: 在大厅中选择或创建一个房间
- 绘画: 使用工具栏选择画笔/橡皮擦,在画布上绘制
- 协作: 其他用户加入同一房间后可实时看到绘画内容
- 保存: 点击 Save 按钮将画布保存到服务器
项目遵循 Linux Kernel Coding Style,使用 .clang-format 配置文件。
make test编译时已包含 -g 标志,可使用 GDB 调试:
gdb ./build/bin/canvas_server
gdb ./build/bin/canvas_client客户端与服务端通过 WebSocket 通信,消息格式为 JSON:
{
"type": "message_type",
"data": { ... }
}主要消息类型:
login/login_resp: 登录register/register_resp: 注册list_rooms/room_list: 房间列表join_room/join_room_resp: 加入房间load_canvas: 加载画布数据draw: 绘画同步chat: 聊天消息save_canvas/save_canvas_resp: 保存画布
本项目采用 MIT 许可证,详见 LICENSE 文件。