WebSocket 技术详解:从 HTTP 请求到实时双向通信

举报
yd_222597624 发表于 2026/11/08 04:27:32 2026/11/08
【摘要】 WebSocket 技术详解:从 HTTP 请求到实时双向通信摘要:在现代 Web 应用中,实时通信已经成为一种常见需求,例如即时聊天、在线协作、实时通知和数据监控等。传统 HTTP 请求通常采用客户端主动请求、服务器返回响应的交互模式,在需要频繁更新数据的场景下存在一定局限。WebSocket 是一种支持客户端与服务器进行持久化、双向通信的网络协议。本文将从 WebSocket 的基本概念...

WebSocket 技术详解:从 HTTP 请求到实时双向通信


摘要:


在现代 Web 应用中,实时通信已经成为一种常见需求,例如即时聊天、在线协作、实时通知和数据监控等。传统 HTTP 请求通常采用客户端主动请求、服务器返回响应的交互模式,在需要频繁更新数据的场景下存在一定局限。


WebSocket 是一种支持客户端与服务器进行持久化、双向通信的网络协议。本文将从 WebSocket 的基本概念出发,介绍其工作原理、与 HTTP 的区别、使用方法以及常见应用场景,帮助开发者理解 WebSocket 如何实现高效的实时通信。


关键词: WebSocket、HTTP、实时通信、JavaScript、前后端开发


⸻


一、为什么需要 WebSocket?


在传统 Web 开发中,浏览器通常通过 HTTP 请求与服务器交互。


例如,用户点击按钮后,浏览器向服务器发送请求,服务器处理完成后返回结果。


但如果希望网页能够实时接收最新消息,传统请求方式就存在一定限制。


以聊天应用为例,假设用户希望及时看到其他人发送的消息。


一种简单的解决方式是使用轮询(Polling):


浏览器 服务器

  | |

  |------ 请求消息 ----->|

  |<----- 返回结果 ------|

  | |

  |------ 请求消息 ----->|

  |<----- 返回结果 ------|

  | |

  |------ 请求消息 ----->|

  |<----- 返回结果 ------|


浏览器每隔一段时间向服务器请求一次数据,例如每秒查询一次是否有新消息。


这种方式虽然容易实现,但存在两个问题:


1. 即使没有新消息,浏览器也需要不断发送请求,增加网络和服务器开销。

2. 消息的实时性受轮询间隔影响,可能产生一定延迟。


因此,我们需要一种让服务器能够主动向浏览器发送消息的通信方式。


WebSocket 正是为这类需求设计的。


二、什么是 WebSocket?


WebSocket 是一种基于 TCP 的网络通信协议,支持客户端与服务器之间的全双工通信。


所谓全双工,就是通信双方可以在连接建立后独立发送消息,而不需要遵循传统的“一次请求对应一次响应”模式。


WebSocket 通常通过 HTTP Upgrade 握手建立连接,然后切换到 WebSocket 协议进行通信。


          建立 WebSocket 连接

浏览器 ------------------------> 服务器

       <------------------------

             握手成功

          持续双向数据通信

浏览器 <======================> 服务器


WebSocket 具有以下特点:


* 双向通信: 客户端和服务器都可以主动发送消息。

* 持久连接: 建立连接后,可以持续进行数据交互。

* 较低协议开销: 后续消息不需要重复传输完整的 HTTP 请求头。

* 适合实时场景: 能够减少频繁轮询带来的额外开销和等待延迟。


需要注意,WebSocket 并不一定在所有场景下都比 HTTP 更好。


如果只是偶尔查询一次数据,普通 HTTP 请求通常更加简单。


三、WebSocket 与 HTTP 有什么区别?


HTTP 和 WebSocket 都可以用于客户端与服务器之间的数据交换,但二者的通信方式不同。


对比维度 HTTP WebSocket

通信模式 请求与响应 全双工通信

连接方式 可复用连接,但通常按请求交互 建立持久连接

服务器主动推送 需借助 SSE 等机制 原生支持

协议开销 每次请求需要相应头信息 建立连接后消息开销较小

适用场景 接口请求、资源获取 聊天、实时通知、在线协作


这里需要纠正一个常见误区:HTTP 并不意味着每次请求都必须重新建立 TCP 连接。


现代 HTTP 已经支持连接复用、多路复用等机制。


WebSocket 的核心优势并不是简单地减少连接次数,而是提供了一种适合持续双向消息交换的通信模型。


四、WebSocket 的工作原理


WebSocket 的通信过程主要分为三个阶段。


4.1 建立连接


客户端首先向服务器发起握手请求。


在基于 HTTP/1.1 Upgrade 的典型握手中,请求头会包含类似内容:


GET /chat HTTP/1.1

Host: example.com

Upgrade: websocket

Connection: Upgrade

Sec-WebSocket-Key: exampleKey

Sec-WebSocket-Version: 13


其中,Upgrade: websocket 表示客户端希望升级为 WebSocket 协议。


如果服务器接受请求,会返回状态码 101 Switching Protocols,完成协议切换。


4.2 双向消息传输


连接建立后,双方可以通过 WebSocket 帧发送文本或二进制数据。


例如:


客户端 服务器

   | |

   |------ 你好 ----------->|

   | |

   |<----- 收到消息 ---------|

   | |

   |<----- 新通知 ----------|

   | |

   |------ 已阅读 --------->|


这种通信方式特别适合消息发送频繁、实时性要求较高的应用。


4.3 关闭连接


当客户端退出页面、网络中断或者服务器主动断开连接时,WebSocket 连接可能关闭。


正常情况下,通信双方可以通过关闭帧完成连接关闭流程。


应用程序通常还需要处理异常断开、连接超时和网络恢复等情况。


五、实战:使用 JavaScript 实现简单的 WebSocket 通信


下面通过一个简单示例,实现浏览器与 Node.js 服务器之间的实时消息交互。


5.1 创建 WebSocket 服务器


首先初始化项目并安装 ws:


npm init -y

npm install ws


创建 server.js 文件:


const WebSocket = require("ws");

const server = new WebSocket.Server({

  port: 8080

});

server.on("connection", (socket) => {

  console.log("客户端已连接");

  socket.on("message", (message) => {

    const text = message.toString();

    console.log("收到消息:", text);

    socket.send("服务器回复:" + text);

  });

  socket.on("close", () => {

    console.log("客户端已断开连接");

  });

});

console.log("WebSocket 服务运行在 8080 端口");


运行服务器:


node server.js


此时,WebSocket 服务器已经启动并监听本地 8080 端口。


5.2 浏览器端实现


创建 index.html:


<!DOCTYPE html>

<html lang="zh-CN">

<head>

  <meta charset="UTF-8">

  <title>WebSocket 示例</title>

</head>

<body>

  <h2>WebSocket 实时通信</h2>

  <input id="message" placeholder="输入消息">

  <button onclick="sendMessage()">发送</button>

  <div id="result"></div>

  <script>

    const socket = new WebSocket(

      "ws://localhost:8080"

    );

    socket.onopen = () => {

      console.log("连接成功");

    };

    socket.onmessage = (event) => {

      document.getElementById("result")

        .textContent = event.data;

    };

    socket.onclose = () => {

      console.log("连接关闭");

    };

    function sendMessage() {

      const input = document.getElementById("message");

      if (socket.readyState === WebSocket.OPEN) {

        socket.send(input.value);

      } else {

        alert("连接尚未建立");

      }

    }

  </script>

</body>

</html>


在浏览器中打开页面,输入消息并点击发送按钮,就可以看到服务器返回的内容。


整个过程无需刷新网页。


这个示例展示了 WebSocket 最基本的三个操作:


* new WebSocket():创建连接;

* socket.send():发送消息;

* socket.onmessage:监听服务器消息。


六、WebSocket 有哪些典型应用?


WebSocket 已经广泛应用于各种需要实时交互的系统。


1. 即时聊天


聊天软件可以通过 WebSocket 将新消息实时推送给在线用户,减少频繁查询消息的需求。


2. 实时数据看板


例如服务器性能监控、实时交易行情和业务数据统计。服务器可以持续推送数据,前端动态更新图表。


3. 在线协作


在线文档、多人白板等系统需要快速同步不同用户的操作。WebSocket 能够作为实时事件传输通道。


4. 多人在线游戏


WebSocket 可以支持浏览器与服务器持续交换游戏状态和用户操作,适用于部分实时互动场景。


七、实际开发需要注意什么?


虽然 WebSocket 使用方便,但在生产环境中还需要考虑几个问题。


7.1 连接安全


WebSocket 提供两种常见的连接形式:


* ws://:普通 WebSocket 连接。

* wss://:通过 TLS 加密的 WebSocket 连接。


生产环境应优先使用 wss://,避免消息在传输过程中被窃听或篡改。


7.2 断线重连


移动网络切换、服务器重启等情况都可能导致连接断开。


可以通过监听 onclose 事件,在适当条件下重新建立连接。


实际项目中建议采用指数退避机制,避免大量客户端同时频繁重连。


7.3 心跳检测


对于长时间运行的连接,可以通过心跳机制判断客户端与服务器之间的连接是否仍然有效。


WebSocket 协议本身提供 Ping/Pong 控制帧;浏览器应用也可以根据需要实现应用层心跳。


7.4 身份验证与权限控制


WebSocket 连接建立后仍然需要验证用户身份,并检查用户是否有权限访问对应的消息和资源。


不能因为客户端成功建立连接,就默认其拥有全部操作权限。


八、总结


WebSocket 是现代 Web 实时通信的重要基础技术。


它通过建立持久化的双向通信连接,让浏览器和服务器可以更加灵活地交换消息,特别适合即时聊天、实时通知、在线协作和数据监控等应用场景。


相比传统轮询方式,WebSocket 能够减少不必要的请求开销,并提升消息交互的实时性。


不过,WebSocket 也引入了连接管理、心跳检测、断线恢复和身份验证等额外工作。因此,在实际开发中应该根据业务需求合理选择通信方式,而不是所有请求都使用 WebSocket。


技术选型的关键不是追求某一种协议,而是选择最适合当前通信需求的方案。


⸻


参考资料


1. MDN Web Docs — WebSocket API:https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API

2. RFC 6455 — The WebSocket Protocol:https://www.rfc-editor.org/rfc/rfc6455

3. Node.js WebSocket(ws):https://github.com/websockets/ws

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。