Javascript 如果onclick处理程序的大小超过126,则websocket duplicate将从浏览器客户端发送。Firefox/Chrome

Javascript 如果onclick处理程序的大小超过126,则websocket duplicate将从浏览器客户端发送。Firefox/Chrome,javascript,php,google-chrome,firefox,websocket,Javascript,Php,Google Chrome,Firefox,Websocket,当在onclick事件中调用send并且消息大小超过126时,firefox/chrome浏览器会发送双重消息。我不确定这是否是webkit/firefox/chrome源代码中的错误。刚刚在PHP Rachet上确认了这个bug,尽管我没有使用它。也许WebSocket的规范最近发生了变化 复制: 从最新的firefox/chrome发送大于126字节的消息。看看wireshark+接收端。客户端发送2帧。接收端获取完整帧,然后获取包含垃圾或部分内容的已损坏帧。但是,帧头中的长度对齐,所有内容

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

复制: 从最新的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个字节的报头。然后我们点击解析垃圾,它被正确识别为92字节,并解析到缓冲区的末尾。尺寸小于126时不会出现这种情况

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

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

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

发送不是线程安全的。不像文件上说的那样。要进行复制,请同时从两个事件处理程序调用send两次。

您确定不是为同一事件注册了两次的javascript单击处理程序吗?我应该两次获得相同的消息。不是1个正常和1个损坏。在我看来,事件处理程序是一个bug。我禁用了双重注册,一切正常。