37 lines
1.6 KiB
Markdown
37 lines
1.6 KiB
Markdown
# 05 - 文本传输(含大文本分片)
|
||
|
||
## 功能目标
|
||
- 支持在房间内发送/接收文本消息。
|
||
- 支持大文本自动分片(避免单包过大导致失败或卡顿)。
|
||
|
||
## 前端(Vue)
|
||
- **输入与发送**
|
||
- `MessageInput.vue`:输入框 + 发送按钮;支持 Ctrl+V 粘贴填充。
|
||
- 发送前校验:非空、长度上限(建议)。
|
||
- **大文本分片(建议实现方式)**
|
||
- 当文本长度超过阈值(如 8KB/32KB)时:
|
||
- 生成 `messageId`(可复用 `senderId + timestamp` 或 UUID)
|
||
- 拆分为 `totalChunks` 段
|
||
- 逐段发送 `TEXT`,携带 `isChunk=true/chunkIndex/totalChunks`,并在 payload 中携带 `messageId`
|
||
- 接收端按 `messageId` 缓存分片并重组,重组完成后再写入消息列表。
|
||
- **展示与防护**
|
||
- 文本内容按纯文本展示(转义),禁止 `v-html`。
|
||
|
||
## 后端(Spring Boot)
|
||
- **处理策略**
|
||
- 默认透传广播即可:在 `/app/room/{roomCode}/message` 收到后补齐 `timestamp` 并广播。
|
||
- (可选)限流/长度限制:防刷屏与恶意超大文本。
|
||
|
||
## 协议与数据
|
||
- `type=TEXT`
|
||
- `payload` 推荐字段:
|
||
- `content`:文本内容(单片)
|
||
- `isChunk`:是否为分片
|
||
- `chunkIndex/totalChunks`:分片序号与总片数
|
||
- `messageId`:(建议新增)用于重组与去重
|
||
|
||
## 边界与注意点
|
||
- **重组内存**:前端缓存分片需设定超时清理,避免长期占用内存。
|
||
- **乱序/丢片**:WebSocket 一般有序但重连/异常情况下仍可能丢失;可以在 UI 上提示“分片未完整接收”。
|
||
|