【无标题】

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+ 支持
相关推荐
椰猫子2 小时前
Javaweb(Filter、Listener、AJAX、JSON)
java·开发语言
IT_陈寒2 小时前
SpringBoot自动配置把我都整不会了
前端·人工智能·后端
朝新_2 小时前
【Spring AI 】核心知识体系梳理:从入门到实战
java·人工智能·spring
一 乐2 小时前
旅游|基于springboot + vue旅游信息推荐系统(源码+数据库+文档)
java·vue.js·spring boot·论文·旅游·毕设·旅游信息推荐系统
我命由我123453 小时前
Android 开发中,关于 Gradle 的 distributionUrl 的一些问题
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
橙露3 小时前
SpringBoot 全局异常处理:优雅封装统一返回格式
java·spring boot·后端
最逗前端小白鼠3 小时前
vue3 数据响应式遇到的问题
前端·vue.js
awei09163 小时前
MinIO配置自定义crossdomain.xml跨域策略(Nginx反向代理实现)
xml·java·nginx
谁怕平生太急3 小时前
面试题记录:在线数据迁移
java·数据库·spring