我已经在现有的服务器中实现了websocket服务器。握手很好,然后我甚至可以发送第一条消息,客户端浏览器会收到它。但是任何后续消息都会断开 websocket。在铬上,我收到以下错误。
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,95,105,110,102,111,32,97,118,95,112,111,116,61,34,49,49,34,32,104,97,110,100,115,95,112,101,114,95,104,111,117,114,61,34,48,46,50,48,34,32,47,62>>
正如您在上面的代码中看到的,我的掩码位始终设置为 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" />
您甚至没有有效负载长度声明与示例缓冲区中剩余的内容不匹配。
在这一点上,明智的做法是查看镀铬检查工具,以了解它认为它得到的框架。 之后的下一步是尝试使用像WireShark这样的工具捕获网络流量,以查看正在发生的事情。
怀疑您在网络上发送的 # 字节与您在 payloadLength 中声明的内容不同。 (我见过的常见方法是发送的字节数比您声明的要多)
例如分配 1024 字节的缓冲区,正确填写前 48 个,然后发送整个 1024 个字节。 这将弄乱下一帧的解析。