大家好,提前感谢,
根据RFC 6455
,我正在用c++滚动我自己的WebSocket服务器(今天早上我也快速地用c#滚动了一个,以仔细检查这里发生了什么)。我已经阅读了标准,现在我有一个服务器,将成功地与客户端建立连接。我可以完成握手,并从一个简单的测试客户端发送数据,该数据在另一端被正确接收。
当测试用FireFox/JS发送数据到我的服务器时,我在服务器端收到一堆乱码。我已经用WireShark监视了套接字,并确定服务器正在正确接收数据,但是我在解释它时遇到了麻烦。
我试图发送字符串"test"(没有引号)到我的服务器,最后一次尝试它看起来像这样:
0x81
0x84
0x1e
0x31
0x65
0xaf
0x6a
0x54
0x16
0xdb
其中大多数甚至不是可打印的字符,每次我单击Send时,这些值都会改变(除了0x81
,它总是第一个字符)。注:这是在尝试按照规范修剪0x00
和0xFF
填充之前。
在firefox握手请求中,它指定Accept-Encoding如下:
Accept-Encoding: gzip, deflate
然而,我尝试用GZIP和DEFLATE解压,都抛出错误。我还尝试将Lorem Ipsum发送到服务器,它具有相同的结果(0x81后面跟着一堆字符)
有人能解释一下吗?这实际上是压缩的吗?为什么发送相同的字符串每次给出不同的结果?FireFox会发送时间戳数据吗?我想要的只是在服务器端正确地将字符串解释回"test"
以下是来自FireFox的完整请求:
GET / HTTP/1.1
Host: 127.0.0.1:8888
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip, deflate
Sec-WebSocket-Version: 13
Origin: null
Sec-WebSocket-Key: lXen8aJPlv/0JOZBb4WAtA==
Connection: keep-alive, Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
以下是我的服务器的完整回复:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: WHTW6PSJ/pWIPskBw0owBT/jacw=
这是成功的,我甚至在javascript结束时得到OPEN,然后当我单击一个按钮调用send("test")时,我收到上面第一块代码中显示的垃圾…
查看RFC 6455 (https://www.rfc-editor.org/rfc/rfc6455#section-5.3)的5.3节。客户端到服务器的websocket消息使用异或和在消息头中发送的密钥进行屏蔽。您需要打开此密钥并使用它来解码消息。不涉及压缩
在这里的特定示例中,前六个字节是帧报头。帧报头的最后四个字节是屏蔽键。如果您将四个屏蔽键字节与剩余的四个有效负载字节进行异或,您应该得到您的"测试";