讲师中心 微信公众号
AI工具推荐 视频效率加速

Javascript中的WebSocket如何工作_如何使用Javascript实现实时通信?

千婷酱_5940

千婷酱_5940

发布时间:2026-01-01 21:37:32

|

603人浏览过

|

来源于php中文网

原创

WebSocket是独立于HTTP的全双工TCP协议,仅握手阶段借用HTTP Upgrade头,后续通信脱离HTTP请求/响应模型,需专用API、服务端支持及手动重连。

javascript中的websocket如何工作_如何使用javascript实现实时通信?

WebSocket 是什么,和 HTTP 有什么根本区别?

WebSocket 不是 HTTP 的升级版,也不是“带长连接的 AJAX”。它是一个独立的、基于 TCP 的全双工通信协议,握手阶段借用了 HTTP(用 Upgrade: websocket 头),但一旦连接建立,后续数据就完全脱离 HTTP 格式,不再有请求/响应模型,客户端和服务端可以随时互发消息。

这意味着:
– 你不能用 fetch() 或 XMLHttpRequest 模拟 WebSocket 行为;
– 服务端必须明确支持 WebSocket 协议(比如 Node.js 用 ws 库,Python 用 websockets);
– 浏览器里没有“重连自动机制”,断线后得自己处理 onclose 并调用 new WebSocket(...)。

如何创建并维持一个可用的 WebSocket 连接?

直接 new WebSocket(url) 很简单,但生产环境必须处理状态、错误和重连。关键点:

  • url 必须以 ws://(开发)或 wss://(生产)开头,不能是 http://
  • 连接未就绪时发消息会触发 onerror,必须等 readyState === WebSocket.OPEN 才能 send()
  • onopen 只表示握手成功,不代表服务端已准备好业务逻辑;建议约定一个 handshake 消息来回确认
  • 不要依赖 onerror 判断断连——它不总触发;主要靠 onclose + 定时 ping(服务端发、客户端响应)来探测死链
const socket = new WebSocket('wss://api.example.com/ws');

socket.onopen = () => {
  console.log('Connected');
  socket.send(JSON.stringify({ type: 'handshake', token: 'xxx' }));
};

socket.onmessage = (event) => {
  const data = JSON.parse(event.data);
  if (data.type === 'pong') return; // 心跳响应
  console.log('Received:', data);
};

socket.onclose = (event) => {
  console.log('Disconnected', event.code, event.reason);
  // 这里触发重连逻辑(带退避)
};

为什么 send() 有时静默失败,或消息顺序错乱?

WebSocket.send() 是异步且无返回值的,失败不会抛异常,只可能触发 onerror(但不可靠)。更常见问题是:

立即学习“Java免费学习笔记(深入)”;

Miller CSV TSV JSON 数据处理器
Miller CSV TSV JSON 数据处理器

Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。

下载
  • 发送时 readyState 是 CLOSING 或 CLOSED → 消息直接丢弃,无提示
  • 高频调用 send() 而没做节流 → 浏览器内部缓冲区溢出,部分消息被静默截断(尤其在弱网下)
  • 服务端未按顺序处理消息 → WebSocket 本身保证帧顺序,但如果你在服务端用多线程/多进程处理不同消息,业务层顺序就无法保障

建议做法:
– 发送前检查 socket.readyState === WebSocket.OPEN;
– 对关键操作加客户端序列号(如 { id: Date.now(), action: 'submit' }),服务端回执确认;
– 避免连续 send(),用 setTimeout 或 Promise.resolve().then() 让出 JS 主线程。

如何安全地传递结构化数据?

WebSocket 原生只收发 string 或 ArrayBuffer,JSON 是最常用选择,但要注意:

  • 别直接 socket.send(obj) —— 会转成 [object Object] 字符串,服务端解析失败
  • 大对象 JSON.stringify() 可能卡顿主线程,超 1MB 建议分片或改用 ArrayBuffer + Uint8Array
  • 服务端若未校验 Content-Type 或长度,恶意客户端可发超长字符串导致 OOM

推荐封装一层:

function sendJSON(socket, data) {
  if (socket.readyState !== WebSocket.OPEN) return false;
  try {
    socket.send(JSON.stringify(data));
    return true;
  } catch (e) {
    console.error('Send failed:', e);
    return false;
  }
}

真实项目中,协议层往往还需加版本号、签名、压缩标记(如 { v: 2, s: 'sha256...', d: { ... } }),这些都得前后端对齐。

WebSocket 看似简单,但真正稳定运行的关键不在连接建立那一刻,而在连接生命周期里的每一次 send、每一条 onmessage 解析、每一个 onclose 后的决策——这些细节没兜住,实时性就只是幻觉。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

1975

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2662

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

916

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2979

2025.09.10

ajax教程
ajax教程

php中文网为大家带来ajax教程合集,Ajax是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。php中文网还为大家带来ajax的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2320

2023.06.14

ajax中文乱码解决方法
ajax中文乱码解决方法

ajax中文乱码解决方法有设置请求头部的字符编码、在服务器端设置响应头部的字符编码和使用encodeURIComponent对中文进行编码。本专题为大家提供ajax中文乱码相关的文章、下载、课程内容,供大家免费下载体验。

340

2023.08.31

ajax传递中文乱码怎么办
ajax传递中文乱码怎么办

ajax传递中文乱码的解决办法:1、设置统一的编码方式;2、服务器端编码;3、客户端解码;4、设置HTTP响应头;5、使用JSON格式。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2153

2023.11.15

ajax网站有哪些
ajax网站有哪些

使用ajax的网站有谷歌、维基百科、脸书、纽约时报、亚马逊、stackoverflow、twitter、hacker news、shopify和basecamp等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1141

2024.09.24

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

20

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 11.9万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn