5.4 KiB
5.4 KiB
📘 WebSocket 通讯协议设计文档
1. 概述
本协议用于实现 即时聊天(IM)系统的实时消息传输。 客户端通过 WebSocket 连接后与服务器保持长连接,实现消息推送、状态同步、群聊与单聊。
支持功能:
- 用户登录鉴权
- 单聊消息发送/接收
- 群聊消息发送/接收
- 消息撤回、已读回执
- 心跳保活与断线重连
- 系统通知(好友请求、群邀请)
2. 消息传输格式
2.1 基础消息结构(JSON)
{
"type": "MESSAGE_TYPE",
"requestId": "string", // 客户端生成的请求ID,便于幂等
"from": 1001, // 发送者ID
"to": 1002, // 接收者ID(单聊)或群ID(群聊)
"chatType": "single", // "single" | "group"
"contentType": "text", // "text" | "image" | "file" | "voice" | "system"
"content": "消息内容或文件URL",
"timestamp": 1700000000 // Unix时间戳
}
2.2 常用 type 枚举
| type | 说明 |
|---|---|
| AUTH | 握手鉴权 |
| HEARTBEAT | 心跳保活 |
| MESSAGE | 普通聊天消息(单聊/群聊) |
| MESSAGE_ACK | 消息已读/送达回执 |
| MESSAGE_RECALL | 消息撤回 |
| FRIEND_REQUEST | 好友申请通知 |
| GROUP_INVITE | 群邀请通知 |
| SYSTEM_NOTICE | 系统公告/通知 |
| ERROR | 错误消息 |
3. 握手与鉴权
3.1 客户端连接
ws://example.com/ws?token=xxxx
- 客户端通过 Token 鉴权
- 服务器验证 Token 后,返回 AUTH_SUCCESS 或 AUTH_FAIL
3.2 服务端响应示例
成功:
{
"type": "AUTH",
"status": "success",
"userId": 1001,
"timestamp": 1700000000
}
失败:
{
"type": "AUTH",
"status": "fail",
"code": 1006,
"message": "Token无效或过期"
}
4. 心跳机制
4.1 客户端发送
{
"type": "HEARTBEAT",
"timestamp": 1700000000
}
4.2 服务器响应
{
"type": "HEARTBEAT",
"timestamp": 1700000000
}
- 客户端:每隔 30 秒发送一次心跳
- 服务器:若 2 倍心跳时间未收到消息,则断开连接
5. 消息传输
5.1 单聊消息
客户端发送:
{
"type": "MESSAGE",
"requestId": "uuid-001",
"from": 1001,
"to": 1002,
"chatType": "single",
"contentType": "text",
"content": "你好",
"timestamp": 1700000000
}
服务器推送给接收者:
{
"type": "MESSAGE",
"messageId": 50001,
"from": 1001,
"to": 1002,
"chatType": "single",
"contentType": "text",
"content": "你好",
"timestamp": 1700000000
}
5.2 群聊消息
{
"type": "MESSAGE",
"requestId": "uuid-002",
"from": 1001,
"to": 3001, // 群ID
"chatType": "group",
"contentType": "image",
"content": "http://img.example.com/xxx.jpg",
"timestamp": 1700000000
}
服务器会 推送到群成员列表(除了自己)。
5.3 消息回执(MESSAGE_ACK)
客户端收到消息后发送:
{
"type": "MESSAGE_ACK",
"messageId": 50001,
"from": 1002,
"to": 1001,
"chatType": "single",
"status": "read",
"timestamp": 1700000000
}
服务器更新消息状态,并可推送给发送方。
5.4 消息撤回(MESSAGE_RECALL)
客户端请求撤回消息:
{
"type": "MESSAGE_RECALL",
"messageId": 50001,
"from": 1001,
"to": 1002,
"chatType": "single",
"timestamp": 1700000010
}
服务器验证是否允许撤回(时间限制、权限等),允许则推送给接收方:
{
"type": "MESSAGE_RECALL",
"messageId": 50001,
"from": 1001,
"chatType": "single",
"status": "success",
"timestamp": 1700000010
}
6. 好友 / 群邀请通知
6.1 好友申请(FRIEND_REQUEST)
{
"type": "FRIEND_REQUEST",
"requestId": "uuid-003",
"from": 1001,
"to": 1002,
"content": "加个好友吧",
"timestamp": 1700000020
}
6.2 群邀请(GROUP_INVITE)
{
"type": "GROUP_INVITE",
"inviteId": "uuid-004",
"groupId": 3001,
"inviter": 1001,
"invitee": 1003,
"content": "邀请你加入群聊",
"timestamp": 1700000030
}
7. 错误处理(ERROR)
{
"type": "ERROR",
"code": 2300,
"message": "消息发送失败",
"requestId": "uuid-001",
"timestamp": 1700000040
}
- code 对应响应 Code 规范
- requestId 可帮助客户端确认失败的具体请求
8. 断线重连
- 客户端断线后,尝试每隔 5 秒重连一次
- 重连成功后,重新发送 AUTH 消息进行鉴权
- 重连后可请求 未读消息同步(message 表或 Redis 缓存)
9. 附录:contentType 示例
| contentType | content 示例 | 描述 |
|---|---|---|
| text | "你好" | 文本消息 |
| image | "http://img.example.com/xxx.jpg" | 图片 URL |
| file | "http://file.example.com/xxx.pdf" | 文件 URL + 文件名 |
| voice | "http://audio.example.com/xxx.mp3" | 语音 URL + 时长 |
| system | "用户xxx加入群" | 系统消息 |