A simple chat room using websocketpp (server) and QWebSocket (client).
一个简易聊天室,由 C++ 实现:
- 服务端:C++ / WebSocket++ / Asio / 控制台程序
- 客户端:C++ / Qt 6 / QWebSocket / Qt Widgets
服务端提供 Visual Studio 2022 解决方案,客户端使用 CMake 构建,支持 Windows / Linux 等平台按需编译。
QymChatRoom/
├─ WSRoom/ # 服务端
│ ├─ ChatServer.h
│ ├─ ChatServer.cpp
│ ├─ server.cpp
│ └─ WSRoom.sln
├─ WSRoomClient/ # 客户端
│ ├─ chatwindow.h
│ ├─ chatwindow.cpp
│ ├─ main.cpp
│ └─ CMakeLists.txt
├─ third-party/ # 第三方依赖
│ ├─ websocketpp/
│ └─ asio/ # 可选,使用 vcpkg 后可不保留
├─ THIRD-PARTY-NOTICES.md
└─ LICENSE
- 昵称登录,服务端检查昵称是否重复
- 上线 / 下线广播
- 群聊广播
- 私聊:
tell [用户名] [消息] - 在线名单:
GetWho - 个人面板:
GetMe - 查询可用指令:
GetCmd/Command - 清屏:
cls/clear - 退出:
exit/quit - 客户端消息按颜色显示:
[G]:绿色[W]:白色[R]:红色- 无前缀:默认白色
当前服务端主要使用
[G]和[R],[W]由客户端保留支持。
| 消息 | 说明 |
|---|---|
昵称 |
未登录时发送,服务端将其作为昵称注册 |
普通文本 |
登录后发送,作为群聊消息广播 |
GetCmd / Command |
查询可用指令 |
GetWho |
查询在线人员 |
GetMe |
查看个人面板 |
tell 用户名 消息 |
私聊指定用户 |
cls / clear |
请求清屏 |
exit / quit |
请求断开连接 |
| 消息 | 说明 |
|---|---|
[G]文本 |
客户端绿色显示 |
[W]文本 |
客户端白色显示,当前服务端未主动使用 |
[R]文本 |
客户端红色显示 |
DO_CLS |
客户端收到后清空聊天区 |
| 其他文本 | 客户端默认白色显示 |
登录:
C -> S: 张三
S -> C: [G]【系统】张三 已上线!
S -> C: [G]【系统】欢迎张三~当前共1人:张三
S -> C: [G]【系统】输入GetCmd或Command查看可用指令
群聊:
C -> S: 大家好
S -> C: [张三]:大家好
私聊:
C -> S: tell 李四 你好
S -> 李四: 【私聊】张三->你:你好
S -> 张三: 【私聊】你->李四:你好
清屏:
C -> S: cls
S -> C: DO_CLS
前往 Releases 页面,下载对应 zip 压缩包,解压后直接运行:
- 服务端:运行
WSRoom.exe,默认监听端口9527 - 客户端:运行
WSRoomClient.exe,输入服务端地址和昵称
使用 vcpkg 管理 Asio 依赖:
vcpkg install boost-asio
vcpkg integrate install然后用 Visual Studio 2022 打开 WSRoom/WSRoom.sln,编译运行即可。
服务端默认端口在 server.cpp 中:
server.Run(9527);如需修改端口,直接修改该处并重新编译。
- 安装 Qt 6.x,确保安装时勾选 Qt WebSockets 模块
- 使用 Qt Creator 打开
WSRoomClient/CMakeLists.txt - 选择 Qt 6.x + MSVC 2022 64bit 或其他可用 Kit
- 配置、编译并运行
- 若 CMake 提示找不到 WebSockets,请确认
CMakeLists.txt中已链接Qt6::WebSockets
客户端默认服务端地址在 main.cpp 中:
"ws://10.94.136.32:9527"本地测试时可改为:
ws://127.0.0.1:9527
-
启动服务端:
WSRoom.exe控制台显示:
监听 9527 成功 -
启动客户端,输入服务端地址:
ws://127.0.0.1:9527 -
输入昵称,例如
张三 -
连接成功后,客户端显示:
成功连接服务端!!! -
输入消息或指令开始聊天:
GetCmd GetWho GetMe tell 李四 你好 cls exit
| 指令 | 说明 | 示例 |
|---|---|---|
GetCmd / Command |
查看所有可用指令 | GetCmd |
GetWho |
查看当前在线人员 | GetWho |
GetMe |
查看个人昵称和在线时长 | GetMe |
tell 用户名 消息 |
给指定用户发送私聊 | tell 李四 你好 |
cls / clear |
清空聊天窗口 | cls |
exit / quit |
退出聊天室 | exit |
| 库 | 版本 | 许可证 |
|---|---|---|
| Qt | 6.x | LGPLv3 |
| websocketpp | 0.8.x | BSD-3-Clause |
| Asio | 1.28.x 或由 vcpkg boost-asio 提供 |
Boost Software License 1.0 |
请检查:
- 服务端是否已启动
- 地址和端口是否正确,例如
ws://127.0.0.1:9527 - 防火墙是否放行
9527端口 - 局域网连接时是否使用服务端机器的局域网 IP
服务端已在 Windows 下设置控制台 UTF-8:
SetConsoleOutputCP(CP_UTF8);请确保源码文件保存为 UTF-8,并使用支持中文的终端字体。
服务端会拒绝重复昵称,并返回红色错误提示。重新输入新的昵称发送即可。
如果提示用户不存在或未在线,请使用 GetWho 查看当前在线名单,确认昵称完全一致。
当前客户端主要处理连接成功、断开和文本消息。若需要更完整的错误提示,可连接 QWebSocket::errorOccurred 信号并显示错误信息。
- 当前仅支持
ws://,未启用 TLS,不支持wss:// - 无密码认证,昵称即身份,存在冒用可能
- 无历史消息、离线消息、图片、文件传输
- 服务端数据保存在内存中,重启后丢失
- 广播时持锁发送,适合小型聊天室,不适合大规模并发
- 客户端默认服务端地址硬编码在
main.cpp中
- 支持
wss:/// TLS - 增加房间、频道、管理员权限
- 使用 SQLite 保存历史消息
- 增加心跳、超时断开、自动重连
- 将协议改为 JSON,便于扩展字段
- 增加客户端连接错误提示和重连按钮
- 将端口、地址、默认昵称改为配置文件或命令行参数