WebSocket 是一种在单个 TCP 连接上进行全双工通信的网络协议,用于在客户端(如浏览器)和服务器之间建立持久性的双向通信通道。与传统的 HTTP 请求-响应模式不同,WebSocket 允许服务器主动向客户端推送数据,从而实现实时交互。
核心特性
- 全双工通信
客户端和服务器可以同时发送和接收数据,无需等待请求响应。 - 低延迟
建立连接后,数据传输无需重复握手,减少了通信开销。 - 持久连接
连接一旦建立,会保持开放状态,直到显式关闭(不同于 HTTP 的短连接)。 - 跨域支持
通过Origin
头部和 CORS 机制管理安全策略。
工作原理
握手阶段
- 客户端通过 HTTP Upgrade 请求发起 WebSocket 连接(使用
Upgrade: websocket
头部)。 - 服务器返回
101 Switching Protocols
响应确认协议升级。 - 握手后,通信切换到二进制帧格式(不再遵循 HTTP 协议)。
- 客户端通过 HTTP Upgrade 请求发起 WebSocket 连接(使用
数据传输
- 使用轻量级的帧(Frame)结构传输数据(文本或二进制)。
- 支持分帧(Fragmentation)处理大规模数据。
心跳机制
通过 Ping/Pong 帧检测连接状态,避免超时断开。
应用场景
- 实时应用:在线聊天、多人协作工具、直播弹幕。
- 游戏开发:多玩家实时交互游戏。
- 金融交易:股票行情、实时报价系统。
- 物联网(IoT):设备状态监控与控制。
示例代码(JavaScript 客户端)
// 创建 WebSocket 连接
const socket = new WebSocket("ws://example.com/socket");
// 监听连接打开
socket.onopen = () => {
socket.send("Hello Server!");
};
// 接收服务器消息
socket.onmessage = (event) => {
console.log("Received:", event.data);
};
// 处理错误
socket.onerror = (error) => {
console.error("WebSocket Error:", error);
};
// 监听连接关闭
socket.onclose = () => {
console.log("Connection closed");
};
服务器端实现
常见支持库:
- Node.js:
ws
、Socket.IO
- Python:
websockets
、Django Channels
- Java:
Jakarta WebSocket
、Netty
- C++:
Boost.Beast
、libwebsockets
与 HTTP/长轮询的区别
特性 | WebSocket | HTTP长轮询 |
---|---|---|
通信模式 | 双向实时 | 单向(需客户端主动轮询) |
延迟 | 低 | 高(依赖轮询间隔) |
overhead | 少 | 多 |
注意事项
- 兼容性:现代浏览器均支持,但需处理旧版本浏览器的降级方案(如使用 Socket.IO)。
- 安全性:使用
wss://
(基于 TLS)加密通信,避免中间人攻击。 - 负载均衡:需支持 WebSocket 的代理或负载均衡器(如 Nginx)。
如果需要进一步了解具体实现或技术细节,可以提供更多上下文!
内容由零声教学AI助手提供,问题来源于学员提问