【无标题】

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+ 支持
相关推荐
lichenyang4532 分钟前
鸿蒙 ArkUI 走马灯卡片实战:从官方文档检索到 Swiper 实现
前端
喵个咪7 分钟前
吃透后台权限系统:从架构设计到 Vue3/React 双框架完整落地
前端·vue.js·react.js
一起逃去看海吧9 分钟前
对接LangSmith
java·前端·数据库
wyhwust9 分钟前
web应用技术-第一次课后作业
java·前端·数据库
问心无愧051312 分钟前
ctf show web入门257
android·前端·笔记
java1234_小锋12 分钟前
什么是 RAG(检索增强生成)?请简述 Spring AI 实现 RAG 的完整流程,包括涉及的核心组件。
java·人工智能·spring·rag
学且思14 分钟前
Vue3 Patch 算法深度解析:从原理到源码实现
前端·vue.js
streaker30318 分钟前
从复制 Token 到复用登录态:site-fetchkit 的抽离过程
前端·浏览器·ai编程
砍材农夫20 分钟前
物联网 基于netty核心实战-心跳保活机制
java·后端·物联网·struts·servlet·netty
dsyyyyy110126 分钟前
CSS继承性
前端·css·tensorflow