在移动网络上,端口8080或80的WebSocket连接失败。

4
在我的Web应用程序中,我使用了Node.js和Socket.io。
在本地或WiFi网络中测试应用程序时一切正常,但自从我切换到移动数据后,就会出现连接错误:
WebSocket连接到 'ws://url/socket.io/1/websocket/' 失败:WebSocket握手期间发生错误:意外的响应代码: 502
看起来我的移动服务提供商正在阻止端口8080和80,但是使用其他端口似乎不可能与nodejitsu一起使用。
有没有人有处理移动网络、node.js和socket.io的经验?
编辑: 作为主机,我尝试了Heroku的免费订阅和Nodejitsu的免费订阅。
在移动设备上,我使用http://websocketstest.com/检查了端口,并进行了WiFi测试。在移动设备上,测试未通过端口80和8080。
我认为可以通过另一个端口实现WebSockets,但我不知道如何更改端口或者为什么例如nodejitsu只监听端口80。
3个回答

3

HTTP 502表示“坏的网关”,通常是客户端和服务器之间路径上某个反向代理的标志。

如果你确定不是因为自己的设置问题,你应该尝试禁用socket.io的websocket(和flashsocket)传输:

var io = require('socket.io').listen(...);

io.set('transports', [ 'xhr-polling', 'jsonp-polling', 'htmlfile' ]);

我尝试过了,但似乎通过轮询获取数据会导致巨大的延迟。您能否详细解释一下,“'Bad Gateway'通常是反向代理的标志”的含义? - Yves
@yves,你能否通过编辑你的问题来解释一下你的确切服务器设置是什么?你的Node应用程序是否直接暴露在外部世界中,还是像nginx这样使用了其他东西?你的服务器监听哪些端口?我同意使用轮询传输对延迟来说确实很糟糕,但如果问题出在你的移动服务提供商无法正确处理WebSocket连接,那么你真的无能为力。 - robertklep
@yves 我认为这可能是你的移动服务提供商的问题,或者你正在使用某种形式的移动数据压缩服务(例如 Opera Turbo)。 - robertklep
如果我通过 https 调用页面,似乎能正常工作,因为这时它使用的是 443 端口。 - Yves
@yves 是的,非常像您的移动服务提供商正在代理纯HTTP流量,这会导致WebSockets出现问题。 - robertklep

1
您的node.js应用程序使用WebSockets在本地和WiFi网络上工作。当使用移动数据网络时,会出现502错误。我正在回答这个问题而不是heroku/nodejitsu编辑。
最有可能的原因是网络中存在错误的跳跃,例如反向代理。要通过反向代理使用WebSockets,必须使用http1.1并在连接时升级以从http协议转换为ws协议。一些代理不支持http升级,一些其他事情(例如@roberklep Opera Turbo)会破坏WebSockets无法工作。
从端口80上的http迁移到端口443上的https(使用现在称为TLS的SSL)会在传输层加密数据。大多数这些错误的跳跃都设置为直接发送该数据,从而解决了您的问题。
我找到了另一个StackOverflow Q&A,其中显示了一些在node.js中设置https的代码。该帖子的关键部分如下:
var sslOptions = {
  key: fs.readFileSync(__dirname + '/../ssl/server.key,
  cert: fs.readFileSync(__dirname + '/../ssl/server.pem,
  ciphers: 'ECDHE-RSA-AES256-SHA:AES256-SHA:RC4-SHA:RC4:HIGH:!MD5:!aNULL:!EDH:!AESGCM',
  honorCipherOrder: true };

并且

var server = https.createServer(sslOptions, app); server.listen(443);

我还发现了一个有用的 SSL/TLS简介,其中包括如何获得免费证书的说明。


1

您必须设置数据传输配置:

var io= require('socket.io');
io.set("transports", ["xhr-polling"]);

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - hugsbrugs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接