Files
JoyD/Web/Vue/CubeLib/docs/CubeWebSocket.md
2026-01-30 15:38:48 +08:00

327 lines
8.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# CubeWebSocket
一个功能完善的 WebSocket 组件,支持自动连接、重连、消息队列、心跳机制等功能。
## 基础用法
```vue
<template>
<div>
<div>状态: {{ status }}</div>
<div>消息数量: {{ messages.length }}</div>
<CubeWebSocket
ws-url="ws://localhost:8086/ws"
:auto-connect="true"
:reconnect="true"
:debug-mode="true"
@connected="handleConnected"
@disconnected="handleDisconnected"
@message="handleMessage"
@status-changed="handleStatusChanged"
/>
</div>
</template>
<script setup>
import { ref } from 'vue'
import CubeWebSocket from 'joyd.web.vue.cubelib'
const status = ref('disconnected')
const messages = ref([])
const handleConnected = () => {
console.log('WebSocket 已连接')
status.value = 'connected'
}
const handleDisconnected = (code, reason) => {
console.log('WebSocket 已断开:', code, reason)
status.value = 'disconnected'
}
const handleMessage = (message) => {
console.log('收到消息:', message)
messages.value.push(message)
}
const handleStatusChanged = (newStatus) => {
console.log('状态变化:', newStatus)
status.value = newStatus
}
</script>
```
## Props
| 参数 | 说明 | 类型 | 默认值 | 必填 |
|------|------|------|---------|-------|
| wsUrl | WebSocket 服务器地址 | String | '' | 否 |
| autoConnect | 是否自动连接 | Boolean | true | 否 |
| reconnect | 是否自动重连 | Boolean | true | 否 |
| maxReconnectDelay | 最大重连延迟(毫秒) | Number | 30000 | 否 |
| debugMode | 是否开启调试模式 | Boolean | false | 否 |
| heartbeatInterval | 心跳间隔(毫秒) | Number | 30000 | 否 |
| connectTimeout | 连接超时(毫秒) | Number | 10000 | 否 |
| maxQueueSize | 消息队列最大长度 | Number | 100 | 否 |
### Props 说明
#### wsUrl
WebSocket 服务器的完整 URL 地址。如果为空字符串,则使用默认值 `ws://localhost:8086/ws`
**验证规则**:如果提供值,必须是有效的 URL 格式。
#### autoConnect
组件挂载时是否自动连接到 WebSocket 服务器。
#### reconnect
连接断开后是否自动重连。重连使用指数退避策略,延迟从 1 秒开始,每次失败后翻倍,最大不超过 `maxReconnectDelay`
#### maxReconnectDelay
重连的最大延迟时间(毫秒)。默认为 30 秒。
#### debugMode
是否开启调试模式。开启后会在控制台输出详细的日志信息,包括:
- 连接状态变化
- 消息发送和接收
- 错误信息
- 定时器状态
#### heartbeatInterval
心跳检测的间隔时间(毫秒)。连接成功后会定期发送 `ping` 消息以保持连接活跃。
#### connectTimeout
连接超时时间(毫秒)。如果在指定时间内连接未建立,将自动关闭连接并触发 `error` 事件。
#### maxQueueSize
消息队列的最大长度。当连接未建立时,发送的消息会被加入队列。如果队列已满,新消息将被丢弃并触发 `message-failed` 事件。
## Events
| 事件名 | 说明 | 参数 |
|--------|------|------|
| connected | 连接成功 | - |
| disconnected | 连接断开 | (code, reason) |
| error | 连接错误 | error |
| message | 收到消息 | message |
| status-changed | 状态变化 | status |
| connecting | 开始连接 | - |
| reconnecting | 开始重连 | - |
| message-sent | 消息已发送 | message |
| message-queued | 消息已加入队列 | message |
| message-failed | 消息发送失败 | { message, reason, error? } |
### Events 说明
#### connected
WebSocket 连接成功建立时触发。
#### disconnected
WebSocket 连接关闭时触发。参数包括:
- `code`: 关闭代码(数字)
- `reason`: 关闭原因(字符串)
#### error
发生错误时触发。参数为错误对象。
#### message
收到服务器消息时触发。参数为解析后的消息对象。
#### status-changed
连接状态变化时触发。参数为新的状态字符串,可能的值:
- `disconnected`: 未连接
- `connecting`: 连接中
- `connected`: 已连接
- `reconnecting`: 重连中
- `error`: 错误
#### connecting
开始建立连接时触发。
#### reconnecting
开始重连时触发。
#### message-sent
消息成功发送时触发。参数为发送的消息对象。
#### message-queued
消息加入队列时触发(连接未建立时)。参数为消息对象。
#### message-failed
消息发送失败时触发。参数为对象:
- `message`: 失败的消息对象
- `reason`: 失败原因('queue_full' 或 'send_error'
- `error`: 错误对象(仅在 reason 为 'send_error' 时存在)
## Methods
组件通过 `defineExpose` 暴露了以下方法:
| 方法名 | 说明 | 参数 | 返回值 |
|--------|------|------|--------|
| connect | 连接 WebSocket | - | void |
| disconnect | 断开连接 | - | void |
| send | 发送消息 | (type, data) | void |
| reconnect | 手动触发重连 | - | void |
| getStatus | 获取当前状态 | - | string |
| isConnected | 是否已连接 | - | boolean |
| getQueueSize | 获取队列长度 | - | number |
### Methods 说明
#### connect
手动连接到 WebSocket 服务器。如果已经连接或正在连接,则跳过。
#### disconnect
断开 WebSocket 连接并停止所有定时器(心跳、重连等)。
#### send
发送消息到服务器。参数:
- `type`: 消息类型(字符串)
- `data`: 消息数据(对象)
如果连接已建立,消息会立即发送;否则加入队列。
#### reconnect
手动触发重连。通常不需要调用,组件会自动处理重连。
#### getStatus
返回当前连接状态字符串。
#### isConnected
返回布尔值,表示是否已连接。
#### getQueueSize
返回当前消息队列的长度。
## 消息协议
组件使用二进制协议发送和接收消息:
### 发送格式
```
字节 0: 消息类型0=字符串1=二进制)
字节 1-2: 扩展参数2字节小端序
字节 3-6: 内容长度4字节小端序
字节 7-N: 内容数据
```
发送的消息会被自动包装为以下格式:
```javascript
{
version: 1, // 协议版本
type: '...', // 消息类型
data: {...} // 消息数据
}
```
### 接收格式
组件会自动解析接收到的二进制消息,并触发 `message` 事件。解析后的消息格式与发送格式相同。
## 使用场景
### 场景 1简单的实时通信
```vue
<script setup>
import CubeWebSocket from 'joyd.web.vue.cubelib'
const wsRef = ref(null)
const sendMessage = () => {
wsRef.value?.send('chat', { text: 'Hello' })
}
</script>
<template>
<CubeWebSocket
ref="wsRef"
ws-url="ws://localhost:8086/ws"
@message="(msg) => console.log(msg)"
/>
<button @click="sendMessage">发送消息</button>
</template>
```
### 场景 2自动重连和错误处理
```vue
<script setup>
import { ref } from 'vue'
import CubeWebSocket from 'joyd.web.vue.cubelib'
const status = ref('disconnected')
const errorMessage = ref('')
const handleError = (error) => {
errorMessage.value = error.message || '连接错误'
}
</script>
<template>
<div>
<div>状态: {{ status }}</div>
<div v-if="errorMessage" class="error">{{ errorMessage }}</div>
<CubeWebSocket
ws-url="ws://localhost:8086/ws"
:reconnect="true"
@status-changed="status = $event"
@error="handleError"
/>
</div>
</template>
```
### 场景 3消息队列监控
```vue
<script setup>
import { ref, watch } from 'vue'
import CubeWebSocket from 'joyd.web.vue.cubelib'
const wsRef = ref(null)
const queueSize = ref(0)
watch(queueSize, (newSize) => {
if (newSize > 50) {
console.warn('消息队列积压:', newSize)
}
})
</script>
<template>
<div>
<div>队列大小: {{ queueSize }}</div>
<CubeWebSocket
ref="wsRef"
ws-url="ws://localhost:8086/ws"
@message-queued="queueSize++"
@message-sent="queueSize--"
/>
</div>
</template>
```
## 注意事项
1. **URL 格式**:确保 `wsUrl` 是有效的 WebSocket URL 格式(`ws://``wss://` 开头)
2. **调试模式**:生产环境建议关闭 `debugMode` 以避免日志泄露
3. **消息队列**:队列大小受 `maxQueueSize` 限制,超出部分会被丢弃
4. **心跳机制**:心跳会定期发送 `ping` 消息,确保服务器端不会因超时断开连接
5. **重连策略**:使用指数退避,避免频繁重连造成服务器压力
6. **组件清理**:组件卸载时会自动断开连接并清理所有定时器
## 兼容性
- Chrome >= 16
- Firefox >= 11
- Safari >= 7
- Edge >= 12
- IE >= 10
## 许可证
MIT