【问题标题】:Why a borwser can't connect with WebSocket server?为什么浏览器无法连接 WebSocket 服务器?
【发布时间】:2013-10-14 19:09:26
【问题描述】:

我写了 Websocket 服务器。我认为它会返回一切美好的东西,也许我会错过一些东西。 这是浏览器发送给它的内容:

GET /app HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: pm.local:4444
Origin: http://pm.local
Pragma: no-cache
Cache-Control: no-cache
Sec-WebSocket-Key: dkX2mQo3cBVA0DMQ7m9oTw==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: x-webkit-deflate-frame
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36

然后服务器发送该响应:

HTTP/1.1 101 WebSocket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Origin: http://pm.local
Sec-WebSocket-Location: http://pm.local/app
Sec-WebSocket-Accept: KrfNVY/hsidqg2HX7YBdXHD/SQM=
Sec-WebSocket-Protocol: sample
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: content-type
Access-Control-Allow-Origin: http://pm.local

当然,最后它总是发送 '\r\n'。

你知道这个回复有什么问题吗? 感谢您的帮助

【问题讨论】:

  • 包含更多信息。浏览器端会发生什么?服务器端会发生什么?检查日志。
  • 感谢您的反馈。在浏览器端 websocket 对象 readyState 的值为 0。此外,连接状态为“挂起”。我正在尝试编写 WebSocket 服务器,所以我还没有任何日志。

标签: websocket


【解决方案1】:

请从响应中删除 Sec-WebSocket-Protocol 标头。客户端未发送header时包含无效。

请同时移除 Sec-WebSocket-Location 标头。这是旧规格的东西。未在 RFC 6455 中使用。

【讨论】:

    【解决方案2】:

    感谢您的帮助,但我在代码中发现了一个“错误”。 我用 Java 编写了服务器,响应的每一行都以

    结尾
    '\r' + '\n'
    

    但应该是的

    "\r\n"
    

    就是这样。现在可以了:)

    【讨论】:

      【解决方案3】:

      Sec-WebSocket-Location 应该类似于ws://[host]/[uri],以“ws”而不是“http”开头。

      【讨论】:

      • 如果您在这件事上需要帮助,请提出一个新问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-06
      • 2014-07-20
      • 1970-01-01
      • 2015-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多