Workerman WebSocket怎么传二进制数据

胖晨吖_2623

胖晨吖_2623

2026-09-02

185人浏览

原创

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 设置的绑定关系——它们是一对硬性匹配项,缺一不可,且都必须在“发送动作发生前一刻”生效。漏掉任意一个,连接就断,没别的原因。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

websocket workerman

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2025.12.22

175

11

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

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

2026.01.19

376

22

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

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

2026.03.18

375

14

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

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

2026.05.25

348

33

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

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

2026.05.25

281

20

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

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

2026.05.20

146

15

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

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

2026.05.20

182

12

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

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

2026.05.20

127

13

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebSocket手册
WebSocket手册

共0课时 | 0人学习

Webman中文手册
Webman中文手册

共0课时 | 0人学习