通过3G连接的WebSocket

sut*_*ree 37 iphone websocket node.js 3g socket.io

我一直在玩Socket.io,node.js和WebSockets,所有这些都可以通过wifi连接正常工作.

但是,当我通过3G连接(例如我的iPhone)测试启用WebSocket的应用程序时,似乎回到长轮询是唯一可行的解​​决方案.

使用Socket.io连接失败,"WebSocket连接无效或Origin未验证",然后再回到长轮询.

我不知道WebSockets是否可以通过3G工作 - 有没有人成功让他们这样工作?我已经尝试了许多不同的方法,而且一切似乎都失败了,这让我觉得我正在尝试不可能的事情.

Wil*_*eau 31

众所周知,一些移动电话运营商设置了你被迫通过的完全破碎的透明代理.这是WebSocket工作组从一开始就必须处理的真正烦恼.该协议旨在确保在存在此类产品时它会很快失败,以便您的应用程序可以立即回退到其他方法.如果您发现需要很长时间才能检测到异常情况并退回,请将其报告给IETF的hybi工作组,以便诊断和解决问题.

与此同时,您可以联系您的移动电话运营商,询问他们如何在不通过破损的透明代理的情况下访问网络,或者至少知道他们希望何时修复其已损坏的代理以根据规范支持HTTP.其中一些可能会为您提供多种访问选项.

  • 我在英国的o2,当我访问这个网站<http://websocketstest.com>在WiFi上所有服务工作,在仅3G端口443(SSL)工作.所以可能值得获得证书并使用wss://代替. (9认同)
  • 同样的问题在英国.Websockets无法在O2和Orange上运行. (2认同)
  • 日本的软银也阻止了ws而不是wss (2认同)

Fla*_*cks 11

正如Willy Tarreau所说,它是移动运营商使用的破碎的透明代理.我敢肯定它也不是他们独有的(例如公司的防火墙).您可以使用不同的端口号(至少在移动运营商处)来解决这个问题.端口80以外的东西.使用SSL也可以工作,但我还没有尝试过.

然后你会遇到防火墙阻挡端口80和443之外的所有人的问题.

编写您的websockets应用程序,在端口80和每次连接尝试的其他端口之间切换,让主机监听这两个端口.然后你很有可能连接到服务器.如果你使用linux同时监听两个端口,请使用iptables端口REDIRECT.


Kor*_*nel 9

您可以使用Server-Sent Events协议而不是WebSockets.

SSE更简单,与HTTP兼容,可以通过代理.


Phi*_*ung 6

在某些移动网络上的 Web 套接字连接不良时出现了这些相同的错误。解决了他们;

  1. 移动端口:将 websocket 的服务器和客户端移动到 SSL 端口(端口 443)

  2. Ping keep-alive:每隔 X 秒从客户端向服务器发送定期“ping”消息,并等待“pong”从服务器返回。如果服务器在 Y 秒内没有返回“pong”,请重新启动客户端上的连接。

实施 (1) 将使您大获全胜。