WebSocket 核心 API 速查表

本速查表基于 WebSocket 协议规范及前端实践场景整理,涵盖核心对象属性、方法、事件回调及错误处理方案,适用于日常开发查阅。

一、WebSocket 核心对象与初始化

1. 核心对象

WebSocket:浏览器内置构造函数,用于创建 WebSocket 连接实例,是所有操作的基础。

2. 初始化语法

javascript 复制代码
// 基础语法:ws(非加密)或 wss(加密,类似 HTTPS)
const socket = new WebSocket('ws://example.com'); 
// 加密连接示例(生产环境推荐)
const secureSocket = new WebSocket('wss://example.com'); 
  • 参数说明:URL 必须以 ws://wss:// 开头,指向支持 WebSocket 协议的服务器地址。

二、WebSocket 核心属性

属性名 类型 说明
readyState 数字 连接状态码: 0 - CONNECTING(连接中) 1 - OPEN(连接已打开) 2 - CLOSING(关闭中) 3 - CLOSED(已关闭)
bufferedAmount 数字 已发送但未被服务器确认的字节数,用于判断发送缓冲区是否已满
protocol 字符串 实际使用的子协议(若初始化时指定多个协议,返回服务器选中的协议)
url 字符串 创建连接时使用的 URL(只读)

三、WebSocket 核心方法

方法名 语法 说明
send() socket.send(data) 向服务器发送数据,data 支持字符串、Blob、ArrayBuffer 类型; 注意:连接未打开(readyState!==1)时调用会报错
close() socket.close(code, reason) 主动关闭连接; code(可选):关闭状态码(默认 1005,代表无状态码); reason(可选):字符串,描述关闭原因

四、WebSocket 核心事件回调

WebSocket 通过"事件驱动"处理连接生命周期,需通过绑定回调函数响应各类状态变化。

事件名 绑定方式 触发场景
open socket.onopen = () => {} 连接成功建立时触发(readyState 变为 1)
message socket.onmessage = (event) => {} 收到服务器发送的数据时触发; 通过 event.data 获取数据(自动解析为字符串/Blob)
error socket.onerror = (error) => {} 连接发生错误时触发(如握手失败、网络中断); 注意:错误后连接可能自动关闭
close socket.onclose = (event) => {} 连接关闭时触发(主动关闭或被动关闭); 通过 event.code 获取关闭状态码,event.reason 获取关闭原因

五、常见错误与解决方案

错误类型 可能原因 解决方案
浏览器不支持 WebSocket 使用 IE8 及以下等旧浏览器 检测 typeof WebSocket !== 'function',提示用户更换 Chrome/Firefox 等现代浏览器
握手失败(handshake error) URL 格式错误、服务器未支持 WebSocket 1. 检查 URL 前缀是否为 ws:///wss://; 2. 确认服务器已开启 WebSocket 服务
连接意外关闭(connection closed) 网络波动、服务器重启、长时间无数据传输 onclose 中添加重连逻辑(排除主动关闭场景),结合心跳机制维持连接
发送数据失败 连接未打开(readyState!==1)、数据格式错误 1. 发送前检查 readyState; 2. 确保数据为字符串/Blob/ArrayBuffer 类型
连接超时(timeout) 网络延迟高、服务器超时策略 实现 Ping/Pong 心跳机制(每 30s 发送 Ping 帧),避免连接被服务器主动断开

六、关键状态码说明

WebSocket 定义了标准化状态码,用于标识连接关闭原因,开发中可通过 event.code 获取:

状态码 含义 场景示例
1000 正常关闭 客户端/服务器主动调用 close() 关闭连接
1001 端点离开 客户端页面关闭、服务器下线
1002 协议错误 数据格式不符合 WebSocket 协议规范
1003 不支持的数据类型 发送服务器不支持的数据格式(如二进制数据)
1005 无状态码 关闭时未指定状态码(默认值)
1006 异常关闭 网络中断、连接意外断开(无明确原因)

七、实战常用工具函数

1. 连接状态检测

javascript 复制代码
// 检查连接是否可发送数据
function isSocketAvailable(socket) {
  return socket && socket.readyState === WebSocket.OPEN;
}

2. 安全发送数据

javascript 复制代码
// 确保连接打开后再发送数据
function safeSend(socket, data) {
  if (isSocketAvailable(socket)) {
    socket.send(typeof data === 'object' ? JSON.stringify(data) : data);
  } else {
    console.error('WebSocket 连接未打开,发送失败');
  }
}

3. 心跳机制实现

javascript 复制代码
// 为 socket 添加心跳(每 30s 发送 Ping,5s 未响应则重连)
function addHeartbeat(socket, reconnectFn) {
  let heartbeatTimer;
  let checkTimer;

  // 发送心跳
  function sendPing() {
    if (isSocketAvailable(socket)) {
      socket.send(JSON.stringify({ type: 'ping' }));
      // 等待 Pong 响应
      checkTimer = setTimeout(() => {
        socket.close(1006, '心跳无响应');
        reconnectFn(); // 重连函数
      }, 5000);
    }
  }

  // 启动心跳
  heartbeatTimer = setInterval(sendPing, 30000);

  // 收到 Pong 时清除检查计时器
  socket.onmessage = (event) => {
    const data = JSON.parse(event.data);
    if (data.type === 'pong') {
      clearTimeout(checkTimer);
    }
  };

  // 关闭时清除计时器
  socket.onclose = () => {
    clearInterval(heartbeatTimer);
    clearTimeout(checkTimer);
  };
}
相关推荐
喜欢吃豆12 小时前
使用 OpenAI Responses API 构建生产级应用的终极指南—— 状态、流式、异步与文件处理
网络·人工智能·自然语言处理·大模型
xixixi7777712 小时前
解析一下存储安全——“它是什么”,更是关于“它为何存在”、“如何实现”以及“面临何种挑战与未来”
网络·安全·通信
运维有小邓@12 小时前
实时日志关联分析工具:智能检测潜在安全威胁
运维·网络·安全
j***576813 小时前
电脑可以连接wifi,但是连接后仍然显示没有网络
网络·电脑·php
brave and determined13 小时前
接口通讯学习(day04):RS-232与RS-485:通信接口全解析
网络·uart·通讯·emc·rs232·rs485·嵌入式设计
檀越剑指大厂13 小时前
在家也能远程调代码?WSL+cpolar 的实用技巧分享
网络
秋邱13 小时前
价值升维!公益赋能 + 绿色技术 + 终身学习,构建可持续教育 AI 生态
网络·数据库·人工智能·redis·python·学习·docker
爱学习的大牛12314 小时前
如何系统学习网络渗透测试:从入门到精通的完整指南
网络·学习
程序猿编码14 小时前
PRINCE算法的密码生成器:原理与设计思路(C/C++代码实现)
c语言·网络·c++·算法·安全·prince
飞行增长手记14 小时前
什么是高匿代理IP?安全吗?怎么选?
网络协议·tcp/ip·安全