我正在尝试连接到我的Android设备从应用程序连接到的WebSocket服务器。我在Android设备上捕获了数据包,初始请求标题如下所示:
GET / HTTP/1.1
Pragma: no-cache
Cache-Control: no-cache
Host: example.com:80
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: ysWaBflPV9EmRaB1JpPMOQ==
Origin: http://example.com:80
Sec-WebSocket-Protocol: default-protocol
Sec-WebSocket-Extensions:
Sec-WebSocket-Version: 13
服务器的响应如下所示:
HTTP/1.1 101 Switching Protocols
Date: Wed, 31 Jan 2018 02:37:20 GMT
Connection: upgrade
Set-Cookie: AWSALB=0yaRd5HOPlZSITp+bcXoZoIn/7YOOqE9o4/t/8b3kw2PTxooflm/85w+1JfudEE0Cwb1BUkWPV+t4kOnEm4FbLSWwMMFp8URbblZKj0a0kd0xB+glbLBHWxc/TPW; Expires=Wed, 07 Feb 2018 02:37:20 GMT; Path=/
Server: nginx/1.12.1
Upgrade: websocket
Sec-WebSocket-Accept: bj5wLF8vmyDrA7pqEgbHKbxqQSU=
然后,一些通信开始了,消息中有许多无法识别的字符和一些清晰的单词。我对WebSockets没有多少经验,但我认为它是某种形式的压缩。
我能够使用Node.js中的ws模块向此服务器发送相同的请求,并且我得到了与上面相同的响应。一个值得注意的区别是,当我将协议标头设置为default-protocol时,我收到一条错误,说“"服务器没有发送子协议"”。如果不使用此标题,我仍然会得到相同的响应。
然而,在初始响应之后,即使我在Android设备上执行了操作,我也没有收到任何消息。大约30秒后,连接以代码1006关闭,没有进一步的信息。
我用curl测试了相同的请求并收到了相同的标题,但它在大约30秒后也关闭了: "来自服务器"
的空回复所以我的主要问题显然是:出了什么问题,我该如何解决?
更具体地说,我想知道是否有任何具有WebSocket经验的人都知道我的客户端或服务器本身是否存在问题。
服务器可能在我的Android设备上以某种方式验证我,但我捕获的标题并没有透露任何相关信息。是否习惯于在客户端 - 服务器通信中使用以后的消息验证连接?是否有可能单独的HTTP请求正在为此WebSocket服务器验证我的身份?所有这些事情似乎都不太可能,因为我发现没有其他任何与auth请求相关的数据包。似乎更有可能发送的消息有问题。