【无标题】

WebSocket 是什么?

WebSocket 是一种在单个 TCP 连接 上进行全双工通信 的网络协议。它使得客户端和服务器之间可以进行持久性、双向的实时数据交换。

主要特点

1. 双向通信

  • 不同于 HTTP 的请求-响应模式
  • 服务器可以主动向客户端推送数据
  • 客户端也可以随时向服务器发送数据

2. 低延迟

  • 建立连接后,通信头部开销很小
  • 适合实时应用(如聊天、游戏、股票行情)

3. 持久连接

  • 一次握手,长久连接
  • 避免重复建立连接的开销

与 HTTP 对比

特性 HTTP WebSocket
通信模式 请求-响应 全双工
连接 短连接 长连接
头部开销 每次请求都带完整头部 初始握手后头部很小
服务器推送 需要轮询/长轮询 原生支持

连接建立过程

握手阶段(HTTP Upgrade)

复制代码
客户端 → 服务器:
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13

服务器 → 客户端:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

数据帧格式

WebSocket 数据以帧为单位传输:

复制代码
0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len |    Extended payload length    |
|I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
|N|V|V|V|       |S|             |   (if payload len==126/127)   |
| |1|2|3|       |K|             |                               |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
|     Extended payload length continued, if payload len == 127  |
+ - - - - - - - - - - - - - - - +-------------------------------+
|                               |Masking-key, if MASK set to 1  |
+-------------------------------+-------------------------------+
| Masking-key (continued)       |          Payload Data         |
+-------------------------------- - - - - - - - - - - - - - - - +
:                     Payload Data continued ...                :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|                     Payload Data continued ...                |
+---------------------------------------------------------------+

使用示例

客户端(JavaScript)

javascript 复制代码
// 创建 WebSocket 连接
const socket = new WebSocket('ws://example.com/chat');

// 连接打开
socket.onopen = function(event) {
    console.log('连接已建立');
    socket.send('Hello Server!');
};

// 接收消息
socket.onmessage = function(event) {
    console.log('收到消息:', event.data);
};

// 连接关闭
socket.onclose = function(event) {
    console.log('连接关闭');
};

// 错误处理
socket.onerror = function(error) {
    console.error('WebSocket 错误:', error);
};

服务器端(Node.js 示例)

javascript 复制代码
const WebSocket = require('ws');
const server = new WebSocket.Server({ port: 8080 });

server.on('connection', (socket) => {
    console.log('客户端已连接');
    
    // 接收消息
    socket.on('message', (message) => {
        console.log('收到:', message);
        
        // 发送消息
        socket.send(`服务器回复: ${message}`);
    });
    
    // 连接关闭
    socket.on('close', () => {
        console.log('客户端断开连接');
    });
});

适用场景

  1. 实时聊天应用
  2. 在线游戏
  3. 实时数据监控(股票、物流)
  4. 协同编辑工具
  5. 实时通知推送
  6. 物联网设备控制

安全性

  • 使用 wss://(WebSocket Secure)进行加密通信
  • 同源策略限制
  • 可结合 Token 进行身份验证

浏览器支持

  • 现代浏览器全面支持
  • IE 10+ 支持
相关推荐
杨丰玮4182 分钟前
从零手写Java飞机躲障碍游戏|Swing绘图、鼠标跟随、计时器碰撞检测实战(五)
java·python·游戏·游戏引擎·图形渲染·动画·贴图
前端snow6 分钟前
ai agent---mcp知识汇总
前端
计算机魔术师20 分钟前
AI 写了一半代码,谁来背锅?Anthropic 的安全重构笔记
前端
莫得感情 o28 分钟前
踩坑 - 压测三轮后 502:一个默认 10 的连接池如何拖垮整个服务
java
Escalating_xu29 分钟前
【Linux线程】线程控制全解析:终止、join/detach、cancel、线程栈与 NPTL(下篇)
java·linux·运维
明月_清风37 分钟前
vLLM 深度实战:2026 年生产级 LLM 推理引擎完全指南
前端·后端·ai编程
风月说与山鬼38 分钟前
七、uni-app页面与组件生命周期
前端·uni-app
2602_9599609239 分钟前
电商大厂Java面试实录:Spring Boot/JVM/Redis/Kafka/微服务/安全/测试全解析
java·jvm·spring boot·redis·面试题
绿岛之北42 分钟前
Electron 安全第三章:URL 加载与 WebView
前端·electron
sunoo-22944 分钟前
C 语言文件 IO 全攻略:从基础函数到实战踩坑(BMP 读取 + 词典查询)
linux·c语言·前端·笔记·vscode·学习