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

Workerman WebSocket怎么传二进制数据

胖晨吖_2623

胖晨吖_2623

发布时间:2026-09-02 10:06:59

|

185人浏览过

|

来源于php中文网

原创

Workerman WebSocket服务端默认以文本帧发送数据,若直接send二进制内容而未设置$connection->websocketType为BINARY_TYPE_ARRAYBUFFER,会导致浏览器因帧类型与内容不匹配而断连;必须每次发送前显式设置该属性,且浏览器端需同步设ws.binaryType='arraybuffer'。

workerman websocket怎么传二进制数据

Workerman 的 WebSocket 服务端默认只认 UTF-8 文本,直接 send() 二进制数据(比如 pack() 出来的字节、file_get_contents() 读的图片)会触发协议错误,浏览器断连——这不是你代码写错了,是协议层校验失败。

为什么 send() 二进制数据会断连

WebSocket 协议要求:发送帧必须在帧头中标明类型(text 或 binary)。Workerman 默认把所有 $connection->send($data) 当作文本帧发出去,哪怕 $data 是 raw bytes。浏览器收到二进制内容却看到 text 标记,直接关闭连接并报错 Invalid frame headerConnection closed before receiving a handshake response

关键点:$connection->websocketType 必须显式设置,且只能在 onMessage 或业务逻辑中设置,不能在 onConnect 里提前设(此时连接尚未完成 WebSocket 握手)。

  • $connection->websocketType = \Workerman\Protocols\Websocket::BINARY_TYPE_ARRAYBUFFER:告诉 Workerman 这次 send 要走 binary 帧
  • $connection->websocketType = \Workerman\Protocols\Websocket::BINARY_TYPE_BLOB:对应浏览器端 binaryType = 'blob',但极少用
  • 不设或设错,就等同于强制发 text 帧,二进制数据必炸

怎么正确发二进制数据给浏览器

分两步:先改类型标记,再发原始字节。顺序不能反,且每次发二进制前都得设(它不是连接级配置,而是单次 send 的上下文)。

示例:推送一张 PNG 图片的原始字节

WebSocket 8.18.2
WebSocket 8.18.2

WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。

下载
// 假设 $png_data = file_get_contents('avatar.png');
$connection->websocketType = \Workerman\Protocols\Websocket::BINARY_TYPE_ARRAYBUFFER;
$connection->send($png_data);
  • 必须用原始字节字符串(string 类型,不是 base64、不是 JSON),Workerman 会原样塞进 binary 帧 payload
  • 不能在 onConnect 里设 websocketType —— 此时连接还没升成 WebSocket,设了也无效
  • 如果连续发多次二进制,每次 send() 前都要重新设 websocketType,它不会保持状态
  • 发完二进制后若还要发 JSON 文本,记得切回默认(或不设),否则下一次 send() 还是 binary 帧

浏览器端接收时 binaryType 必须匹配

服务端发的是 ARRAYBUFFER 类型帧,浏览器端必须设 ws.binaryType = 'arraybuffer',否则 event.dataBlob,要额外调 blob.arrayBuffer(),变成异步操作,破坏实时性。

正确写法(放在 onopen 里):

const ws = new WebSocket('ws://your-server.com');
ws.onopen = () => {
  ws.binaryType = 'arraybuffer'; // 关键!必须在这之后收消息
};
ws.onmessage = (e) => {
  if (e.data instanceof ArrayBuffer) {
    const uint8 = new Uint8Array(e.data);
    console.log('收到', uint8.length, '字节');
  }
};
  • binaryType 必须在 onopen 之后、任何 onmessage 触发之前;设晚了,第一批消息可能已按默认 blob 方式交付
  • 不要设成 'blob' 再手动转 —— 对大文件来说,blob.arrayBuffer() 是 Promise,无法保证顺序和低延迟
  • 如果服务端混用 text 和 binary 消息,浏览器端靠 typeof event.datainstanceof 判断类型即可,无需额外协议头

常见踩坑点:大文件分片与内存

Workerman 不自动分片。传几十 MB 的文件时,$connection->send($big_binary) 会把整个字符串加载进内存,可能触发 OOM 或阻塞事件循环。

  • 务必自己分片:用 str_split($big_binary, 65536) 切成 64KB 块,逐块 send,并在每块前加长度头或序号
  • 每发一块后,不要立刻发下一块 —— 等 onBufferDrain 或加简单延时,避免客户端缓冲区溢出
  • 服务端不要长期 hold 住大 string 变量,发完即 unset(),PHP GC 才能及时回收
  • 浏览器端接收时,用 Uint8Array.prototype.set() 合并分片,别用 concat() 创建新数组,避免重复拷贝

最易被忽略的是:binaryType 设置时机和服务端 websocketType 设置的绑定关系——它们是一对硬性匹配项,缺一不可,且都必须在“发送动作发生前一刻”生效。漏掉任意一个,连接就断,没别的原因。

热门AI工具

更多
AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

DeepSeek

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

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

音述AI
音述AI Hot

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

豆包大模型

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

切问学术

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

WorkBuddy

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

UpDream
UpDream Hot

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

相关专题

更多
Golang WebSocket与实时通信开发
Golang WebSocket与实时通信开发

本专题系统讲解 Golang 在 WebSocket 开发中的应用,涵盖 WebSocket 协议、连接管理、消息推送、心跳机制、群聊功能与广播系统的实现。通过构建实际的聊天应用或实时数据推送系统,帮助开发者掌握 如何使用 Golang 构建高效、可靠的实时通信系统,提高并发处理与系统的可扩展性。

175

2025.12.22

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

376

2026.01.19

Python WebSocket实时通信与异步服务开发实践
Python WebSocket实时通信与异步服务开发实践

本专题聚焦 Python 在实时通信场景中的开发实践,系统讲解 WebSocket 协议原理、长连接管理、消息推送机制以及异步服务架构设计。内容包括客户端与服务端通信实现、连接稳定性优化、消息队列集成及高并发处理策略。通过完整案例,帮助开发者构建高效稳定的实时通信系统,适用于聊天应用、实时数据推送等场景。

375

2026.03.18

WebSocket 前端开发与实战技巧
WebSocket 前端开发与实战技巧

聚焦 WebSocket 在前端项目中的工程化实践,涵盖原生 JavaScript WebSocket 连接的封装与状态管理、Vue 3 中 WebSocket 的 Composable 封装(useWebSocket)、React 中自定义 Hook 管理连接生命周期、心跳检测(Ping/Pong 定时器)与自动断线重连的实现策略、指数退避重连算法、消息序列化协议(JSON / Protobuf / MessagePack)的选型与性

348

2026.05.25

WebSocket发送和接收数据教程合集
WebSocket发送和接收数据教程合集

本专题整合了WebSocket发送与接收数据教程合集,阅读专题下面的文章了解更多详细内容。

281

2026.05.25

Workerman安装配置教程
Workerman安装配置教程

Workerman安装配置教程专题提供Workerman安装配置、WebSocket开发、TCP通信、异步编程、高并发服务搭建与PHP实时通信开发教程。

146

2026.05.20

Workerman实时通信与长连接开发教程
Workerman实时通信与长连接开发教程

WWorkerman实时通信与长连接开发教程聚合实时通信、聊天室、长连接、消息推送、AI流式输出等Workerman高并发开发内容。

182

2026.05.20

Workerman异步通信与TCP服务器开发
Workerman异步通信与TCP服务器开发

Workerman异步通信与TCP服务器开发专题整理Workerman异步通信、TCP服务、HTTP服务、WebSocket开发与高并发PHP服务器教程。

127

2026.05.20

Conan私有仓库搭建教程
Conan私有仓库搭建教程

本专题系统的讲解Conan私有仓库的搭建流程,涵盖仓库服务部署、存储目录配置、用户认证、权限划分和远程地址添加,并介绍内部C++依赖包的上传、下载及版本维护方法。

0

2026.09.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Webman中文手册
Webman中文手册

共0课时 | 0人学习

Workerman官方手册
Workerman官方手册

共0课时 | 0人学习

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

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