我一直在玩Socket.io,node.js和WebSockets,所有这些都可以通过wifi连接正常工作。
然而,当我通过3G连接测试支持WebSocket的应用程序时(例如,在我的iPhone上),似乎回到长轮询是唯一可行的解决方案。
使用Socket.io连接失败,“WebSocket连接无效或Origin未验证”,然后再回到长轮询。
我不知道WebSockets是否可以通过3G工作 - 是否有人成功让他们像这样工作?我尝试了许多不同的方法,但似乎都失败了,这让我觉得我在尝试不可能。
答案 0 :(得分:31)
众所周知,有些移动电话运营商会设置您必须通过的完全破碎的透明代理。这是WebSocket工作组从一开始就必须处理的真正烦恼。该协议旨在确保在存在此类产品时它会很快失败,以便您的应用程序可以立即回退到其他方法。如果您发现需要很长时间才能检测到异常情况并退回,请将其报告给IETF的hybi工作组,以便诊断和解决问题。
与此同时,您可以联系您的移动电话运营商,询问他们如何在不通过破损的透明代理的情况下访问网络,或至少知道他们希望何时修复其已损坏的代理以根据规范支持HTTP。其中一些可能会为您提供多种访问选项。
答案 1 :(得分:11)
正如Willy Tarreau所说,移动运营商使用的是透明代理。我敢肯定它也不是他们独有的(例如公司的防火墙)。您可以使用不同的端口号(至少在移动运营商处)来解决这个问题。除了端口80以外的东西。使用SSL也可以工作,但我还没有尝试过。
然后你会遇到防火墙后面的人阻塞端口80和外部的所有东西的问题。 443。
编写您的websockets应用程序,在端口80和每次连接尝试的其他端口之间切换,让您的主机监听这两个端口。然后你很有可能连接到服务器。如果你使用linux同时监听两个端口,请使用iptables port REDIRECT。
答案 2 :(得分:9)
您可以使用Server-Sent Events协议代替WebSockets。
SSE更简单,与HTTP兼容,可以通过代理。
答案 3 :(得分:4)
在某些移动网络上发生了与错误的Web套接字连接相同的错误。解决了他们;
移动端口:将服务器和客户端的websocket移动到SSL端口(端口443)
Ping keep-alive:每隔X秒从客户端向服务器发送定期“ping”消息,并等待“pong”从服务器返回。如果服务器在Y秒内没有返回“pong”,请在客户端重新启动连接。
实施(1)将帮助你完成大部分工作。