0

我已经在我现有的服务器中实现了一个 websocket 服务器。握手很好,然后我什至可以发送第一条消息,客户端浏览器接收它。但是任何后续消息都会断开 websocket。在 chrome 上我收到以下错误。

failed: A server must not mask any frames that it sends to the client.

我的框架是这样创建的

Len = erlang:size(Msg),
if
        Len < 126 ->
             Message = [<<1:1, 0:3,2:4,0:1,Len:7>>,Msg];
        Len < 65536 ->
             Message = [<<1:1, 0:3,2:4,0:1,126:7,Len:16>>,Msg];
        true ->
             Message = [<<1:1, 0:3,2:4,0:1,127:7,Len:64>>,Msg]
 end,

现在,一个要传输的示例数据看起来<< 130,46,60,115,110,112,112,112,105,1110,102,111,111,32,97,118,112,112,112,1161,116,1161,1161,349,49,49,49,49,11111111111111111111111111111111111111111111111111111111111111111111110,11111111111111111111111111111111111卡46,50,48,34,32,47,62>>

正如您在上面的代码中看到的那样,我的掩码位始终设置为 0,但我不明白为什么相同的消息第一次起作用然后我再次发送相同的消息,它抱怨掩码位设置。

有人知道为什么吗?谢谢

4

1 回答 1

0

您粘贴的帧示例数据是正常的。

48 bytes
ErlangSampleBytes[48] = 82 2E 3C 73 6E 70 5F 69  6E 66 6F 20 61 76 5F 70
                        6F 74 3D 22 31 31 22 20  68 61 6E 64 73 5F 70 65
                        72 5F 68 6F 75 72 3D 22  30 2E 32 30 22 20 2F 3E 

它解析/转换为:

82 = fin:true
     rsv1:false
     rsv2:false
     rsv3:false
     opcode:2
2E = masked:false
     payloadLength:46 (decimal)
Payload = UTF8 valid: 
     <snp_info av_pot="11" hands_per_hour="0.20" />

您甚至没有对有效负载长度声明和样本缓冲区中剩余的内容不匹配。

在这一点上,明智的做法是查看 chrome 检查工具以找出它认为它得到的框架。之后的下一步是尝试使用 WireShark 之类的工具捕获网络流量,以查看发生了什么。

怀疑您在线发送的字节数与您在 payloadLength 中声明的字节数不同。(我见过的常见问题是发送的字节数比您声明的要多)

比如分配一个1024字节的缓冲区,把前48个填好,然后把1024个字节全部发送出去。这将弄乱下一帧的解析。

于 2013-09-05T17:15:21.063 回答