通过3G连接的WebSockets

我一直在玩Socket.io,node.js和WebSockets,所有这些我都可以在无线连接上正常工作。

但是,当我通过3G连接(例如,在我的iPhone上)testing一个支持WebSocket的应用程序时,似乎回落到长轮询是唯一可行的解​​决scheme。

使用Socket.io时,连接失败,返回长轮询之前“WebSocket连接无效或Origin not verified”。

我不知道WebSockets是否打算在3G上工作 – 有没有人成功让他们这样工作? 我尝试了许多不同的方法,所有这些都似乎失败了,这让我觉得我正在尝试不可能的事情。

一些手机运营商以设置完全破碎的透明代理而闻名,而这些透明代理是您不得不通过的。 这是WebSocket工作组从一开始就不得不面对的一个真正的烦恼。 该协议旨在确保在出现此类产品时会很快失败,以便您的应用程序可以立即回到其他方法。 如果发现exception情况需要很长时间才能恢复,请将其报告给IETF的hybi工作组,以便对问题进行诊断和处理。

同时,您可以联系您的移动电话运营商,询问他们如何访问networking,而不必通过他们破碎的透明代理,或者至less知道他们希望根据规范来修复它们的破坏代理,以支持HTTP。 其中一些可能会为您提供多种访问选项。

正如Willy Tarreau所说,移动运营商使用的是透明的代理服务器。 我敢肯定这不是排他性的(例如公司公司的防火墙)。 您可以通过使用不同的端口号(至less在移动运营商)解决此问题。 除了端口80以外的东西。使用SSL也可以,但是我还没有尝试过。

然后,你会遇到防火墙后的民间问题阻止80和443端口以外的一切。

编写你的websockets应用程序,以在端口80和每个连接尝试的其他端口之间翻转,让主机监听这两个端口。 那么你有很好的机会连接到服务器。 如果你使用linux同时监听两个端口,使用iptables port REDIRECT。

您可以使用Server-Sent Events协议而不是WebSocket。

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

如果在某些移动networking上出现了一个错误的networking套接字连接,就会出现这些错 解决它们:

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

(2)ping keep-alive:每隔X秒钟从客户端向服务器发送周期性的“ping”消息,等待服务器返回“pong”。 如果服务器在Y秒内没有返回“乒乓”,请重新启动客户端的连接。

执行(1)将使你获得大部分的途径。