javascript - 如果 onclick 处理程序大小超过 126,则 websocket 会从浏览器客户端重复发送。火狐/Chrome

标签 javascript php google-chrome firefox websocket

当 onclick 事件内发生发送调用且消息大小超过 126 时,firefox/chrome 浏览器会发送双消息。我不确定这是否是 webkit/firefox/chrome 源中的错误。刚刚在 PHP Rachet 上确认了这个错误,尽管我没有使用它。也许 WebSockets 的规范最近发生了变化?

复制: 从最新的 firefox/chrome 发送大于 126 字节的消息。看wireshark+接收端。客户端发送 2 帧。接收端获取完整帧,然后获取包含垃圾或部分内容的损坏帧。不过,帧头中的长度是对齐的,并且所有内容都被正确解析。

recved bytes: 293
Header[1] Len: 126
BuffLen: 293 DataLen: 187 Offset: 195
[Got msg]: {"type":"chat","opcode":"sendmessage","message":"faefaefafefaefaefaefafefaefaefaefafefaefaefaefafefaefaefaefafefaefaefaefafefaefa","name":"Karl","userid":114,"compid":1}

Header[1] Len: 92
BuffLen: 293 DataLen: 92 Offset: 293
[Got msg]: �y{"�pe�C"c�t"�[op�de�C"s�dm�
sa�",�es�ge�C"f�fa�af�ae�ef�fa�fa�ae�ef�ef�fa

如您所见,由于某种原因我们收到了 293 字节,第一条消息长度为 187 字节 + 8 字节 header 。然后我们遇到了解析垃圾,它被正确识别为 92 字节并解析到缓冲区的末尾。尺寸低于 126 时不会出现这种情况。

例如,如果在 onconnect 内发送帧,则不会发生这种情况。示例:

BuffLen: 178 DataLen: 170 Offset: 178
[Got msg]: {"type":"chat","opcode":"sendmessage","message":"eafffffffffffffffffffffffffffffffffffffffffffffffffaeggaegaeaeg","name":"Karl","userid":114,"compid":1}

我认为这可能是一个框架/调度问题,数据包应该排队发送?

最佳答案

发送不是线程安全的。与文档所说的不同。要复制,请同时从 2 个事件处理程序调用 send 两次。

关于javascript - 如果 onclick 处理程序大小超过 126,则 websocket 会从浏览器客户端重复发送。火狐/Chrome,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27789653/

相关文章:

javascript - "for"内部 "setInterval"的索引

php - 如何使用序列化通过 jquery 和 php 保存多个复选框

html - Chrome : "ghost" width of floated elements inside inline block

php - PHP 中带有执行命令的 if 语句

php - 基于所选选项值的表单输入值

javascript - Chrome 扩展程序错误 : "Unchecked runtime.lastError while running browserAction.setIcon: No tab with id"

css - Chrome - Font Awesome 5 一些图标不起作用

javascript - 我无法弄清楚下面的 javascript 代码有什么问题。我尝试将函数存储在变量中

javascript - d3 鼠标悬停时绘制一次

javascript - 下一个js : Avoid change css className after run