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

8.4 KiB
Raw Blame History

CubeWebSocket

一个功能完善的 WebSocket 组件,支持自动连接、重连、消息队列、心跳机制等功能。

基础用法

<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: 内容数据

发送的消息会被自动包装为以下格式:

{
  version: 1,  // 协议版本
  type: '...', // 消息类型
  data: {...}  // 消息数据
}

接收格式

组件会自动解析接收到的二进制消息,并触发 message 事件。解析后的消息格式与发送格式相同。

使用场景

场景 1简单的实时通信

<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自动重连和错误处理

<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消息队列监控

<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