Files
quick-share/docs/04-消息协议与消息分发(统一Message模型).md

2.5 KiB
Raw Blame History

04 - 消息协议与消息分发(统一 Message 模型)

功能目标

  • 定义统一消息格式(便于扩展与兼容)。
  • 服务端负责房间维度的消息广播/转发。
  • 前端按 type 分发渲染与业务处理。

协议定义

基础消息格式

{
  "type": "TEXT | FILE | IMAGE | SYSTEM | CHUNK",
  "senderId": "uuid",
  "senderName": "用户昵称",
  "timestamp": 1706345600000,
  "payload": {}
}

文本消息TEXT

{
  "type": "TEXT",
  "senderId": "uuid",
  "senderName": "用户A",
  "timestamp": 1706345600000,
  "payload": {
    "content": "要传输的文本内容",
    "isChunk": false,
    "chunkIndex": 0,
    "totalChunks": 1
  }
}

文件元数据FILE

{
  "type": "FILE",
  "senderId": "uuid",
  "senderName": "用户A",
  "timestamp": 1706345600000,
  "payload": {
    "fileId": "uuid",
    "fileName": "document.pdf",
    "fileSize": 2621440,
    "mimeType": "application/pdf",
    "totalChunks": 10
  }
}

文件分片CHUNK

{
  "type": "CHUNK",
  "senderId": "uuid",
  "payload": {
    "fileId": "uuid",
    "chunkIndex": 0,
    "data": "base64EncodedChunkData"
  }
}

系统消息SYSTEM

{
  "type": "SYSTEM",
  "payload": {
    "event": "USER_JOIN | USER_LEAVE | ERROR",
    "message": "xxx 加入了房间",
    "userList": [{"id": "uuid", "name": "用户A"}]
  }
}

前端分发Vue

  • 入口RoomViewhandleMessage(msg) 或等价逻辑。
  • 分发规则(示例)
    • SYSTEM:更新 userList,并向消息列表追加系统提示。
    • TEXT:追加文本消息(区分 me/other
    • FILE:追加文件卡片(显示名称、大小、下载按钮、进度)。
    • CHUNK:写入文件缓存并更新进度;完成后合并为 Blob。

后端分发Spring Boot

  • 控制器WebSocketController
    • /message:广播常规消息到 /topic/room/{roomCode}
    • /file/chunk:转发分片到文件通道或同房间通道
  • 补齐与校验(建议)
    • 服务端补齐 timestamp,必要时校验 type/payload 的字段完整性、大小限制与频率限制。

边界与注意点

  • 通道设计一致性:若采用“文件独立 topic”前端需额外 subscribe若统一走房间 topic需在 payload 内携带 fileId 并做路由分发。
  • 大消息:避免一次性发送超大 payload统一走分片策略。
  • 安全:前端渲染文本必须转义,禁止把用户内容当 HTML 渲染。