websocket通信

1.了解websocket通信原理

WebSocket 是一种全双工、长连接 的通信协议,基于 TCP,在一次握手后就保持连接,服务器和客户端可以随时互相发数据,不用像 HTTP 那样每次都重新请求。

2.通信阶段

  1. 连接建立 → 2. 通信中 → 3. 连接关闭

    事件回调 触发时机 作用
    onopen 客户端与服务器成功建立 WebSocket 连接时 确认连接成功,可开始收发消息
    onmessage 客户端收到服务器发送的消息时 处理接收到的文本 / 二进制数据
    onerror 连接过程中发生错误(如握手失败、网络异常)时 捕获错误信息,用于调试或重连
    onclose 连接被关闭(主动关闭或意外断开)时 清理资源、记录关闭原因、触发重连逻辑
TypeScript 复制代码
const socket = new WebSocket('ws://localhost:8080');

// 1. 连接成功建立
socket.onopen = () => {
  console.log('连接已建立,可发送消息');
  socket.send('客户端已上线'); // 连接成功后可立即发送消息
};

// 2. 收到服务器消息
socket.onmessage = (event) => {
  // 处理文本消息
  if (typeof event.data === 'string') {
    console.log('收到文本消息:', event.data);
  }
  // 处理二进制消息(如Blob/ArrayBuffer)
  else if (event.data instanceof Blob) {
    console.log('收到二进制消息:', event.data);
  }
};

// 3. 发生错误
socket.onerror = (error) => {
  console.error('连接错误:', error);
  // 可在这里触发重连逻辑
};

// 4. 连接关闭
socket.onclose = (event) => {
  console.log(`连接关闭,原因: ${event.reason},代码: ${event.code}`);
  // event.code 为关闭状态码(如1000表示正常关闭,1006表示意外断开)
};

3.WebSocket 常见状态码

标准关闭状态码 (1000-1003)

  • 1000:正常关闭 (Normal Closure)

    • 用途:表示连接已完成预期操作
    • 典型场景:客户端/服务器主动调用 close(1000, "操作完成")
  • 1001:端点离开 (Going Away)

    • 用途:表示端点主动终止连接
    • 典型场景:服务器关闭或用户离开网页
  • 1002:协议错误 (Protocol Error)

    • 用途:违反 WebSocket 协议规范
    • 典型场景:接收到不符合协议规范的帧
  • 1003:不支持的数据类型 (Unsupported Data)

    • 用途:端点无法处理接收的数据类型
    • 典型场景:服务器仅支持文本消息却收到二进制数据

连接异常中断 (1006)

  • 1006:异常关闭 (Abnormal Closure)
    • 特征:连接非正常中断(无明确关闭帧)
    • 常见原因:网络中断/服务器崩溃/防火墙阻断
    • 注意:该状态码由系统自动生成,不可主动使用

数据处理错误 (1007-1009)

  • 1007:数据格式错误 (Invalid Frame Payload Data)

    • 触发条件:数据格式不符合约定
    • 示例:文本消息包含非 UTF-8 编码字符
  • 1008:策略违规 (Policy Violation)

    • 触发条件:消息内容违反服务器策略
    • 示例:包含非法或受限内容
  • 1009:消息过大 (Message Too Big)

    • 触发条件:消息尺寸超出处理能力

扩展相关错误 (1010-1011)

  • 1010:必需扩展缺失 (Mandatory Extension)

    • 触发条件:服务器不接受客户端要求的扩展
  • 1011:服务器内部错误 (Internal Server Error)

    • 触发条件:服务器遭遇不可恢复的错误

TLS 安全错误 (1015)

  • 1015:TLS 握手失败 (TLS Handshake)
    • 适用范围:wss:// 加密连接
    • 安全限制:该状态码不会通过 onclose 事件直接暴露

自定义状态码规范 (4000-4999)

  • 保留范围 :4000-4999 用于业务级状态标识
    • 典型用例:
      • 4001:认证失败
      • 4002:权限不足
      • 4003:会话超时

特殊说明

  • 状态码 1004 为保留值
  • 常见触发场景:子协议不匹配或鉴权配置错误
  • 解决方案:确保 WebSocket 连接携带有效的认证令牌(需与后端确认具体请求头格式)
相关推荐
Eloudy1 小时前
全文 - IMEX 第01节 -IMEX overview
运维·服务器·网络
物联网软硬件开发-轨物科技1 小时前
【技术白皮书】光伏清检一体化机器人系统解决方案技术白皮书
大数据·运维·网络·人工智能·机器人
Escalating_xu2 小时前
【Linux 网络编程】TCP 跨平台实战:用 Windows 客户端访问 Linux 服务器
linux·服务器·网络
是真的小外套3 小时前
2024年软考中级信息安全工程师|选择题考点+案例分析真题解析(含答案)
android·网络
小天源5 小时前
让访问数据可解释:IP 地球大屏、地区库更新与运行维护设计
网络·网络协议·tcp/ip
老李IT笔记5 小时前
连不上不一定是网不好:新系统不认的服务端配置卡在哪一档
运维·服务器·网络
小此方6 小时前
Linux网络(二十八):从NAT转换到正反向代理:图解内网通信、NAPT端口映射
linux·运维·网络
万年咸鱼6 小时前
WebSocket、Socket 与 HTTP 的区别详解
websocket·网络协议·http
万年咸鱼6 小时前
HTTPS 是如何保证传输安全的?
网络协议·安全·https
隐擎fox7 小时前
深入 Android 移动端风控与协议层对抗:内核级虚拟环境检测、网络堆栈特征伪装与住宅 IP 协同实战
android·网络·python·网络协议·tcp/ip