0

我在同一台机器(即相同的 IP)上有两个不同的浏览器(Chrome 和 Safari),想知道是否可以使用 websocket 将它们连接到同一台服务器?

我试过了。Chrome 连接正常,但 Safari 抛出错误,抱怨:

Error during WebSocket handshake: location mismatch: 
wss://www.mysite.com/sockjs/310/s1a5r_6q/websocket != ws://www.mysite.com/sockjs/310/s1a5r_6q/websocket
sockjs-0.3.js:282Closed transport: websocket SimpleEvent(type=close, code=1006, reason=WebSocket connection broken, wasClean=false)

但我不确定这是否是由于每个 IP 地址一个 websocket 连接的某些限制?

4

4 回答 4

4

MLister,您似乎遇到了 sockjs 部署问题。确保 sockjs 服务器在通过 https 的 websocket 握手期间返回 wss://。这是一些 sockjs 服务器的一个众所周知的问题 - 服务器并不总是知道页面是通过 https 提供的,并在握手期间返回 ws://。

例如 sockjs-node 使用 faye-websocket-node 处理这种情况的代码在这里: https ://github.com/faye/faye-websocket-node/blob/master/lib/faye/websocket.js#L40 https ://github.com/faye/faye-websocket-node/blob/master/lib/faye/websocket.js#L25-L32

基本上,您必须确保您的负载均衡器设置了“x-forwarded-proto”标头。

是否有意义?

于 2012-11-22T11:45:43.083 回答
2

就 WebSocket 协议而言,没有技术限制,尽管规范中有规定限制每个 IP 地址的未完成连接尝试以防止垃圾邮件。只有两个我怀疑你遇到了这个问题。您的 websocket 服务器可能还有其他策略可能会进一步限制这一点。

于 2012-11-21T18:02:35.313 回答
2

wss ://www.mysite.com/sockjs/310/s1a5r_6q/websocket!= ws ://www.mysite.com/sockjs/310/s1a5r_6q/websocket

这表明 websocket 连接通过了一个不理解 websocket 连接的代理。最有可能的是,它是服务器端的反向代理,从代理后面的服务器卸载 SSL 开销。代理向客户端提供了安全连接,但报告了从服务器到客户端的连接不安全。这是不正确的。

于 2012-11-21T18:05:03.187 回答
1

这当然是可能的,至少如果浏览器支持 WebSocket API。您甚至不需要 2 个不同的浏览器,您只需在多个选项卡中打开您的网站,例如在 chrome 中,它应该可以正常工作。

于 2012-11-21T17:59:57.017 回答