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

时间:2013-11-26 17:48:16

标签: node.js sockets socket.io nodejitsu port80

在我的Web应用程序中,我使用Node.js和Socket.io。

当我在本地或我的wifi网络中测试应用程序时,一切都很好,但是由于我切换到移动数据,我收到连接错误:

  

WebSocket连接到   'WS://url/socket.io/1/websocket/'   失败:WebSocket握手期间出错:意外的响应代码:   502

我的移动服务提供商似乎阻止了端口8080和80,但是使用nodejitsu似乎无法切换到另一个端口。

有人有经验如何处理移动网络,node.js和socket.io?

修改
作为主持人,我尝试了免费订阅Heroku和免费订阅Nodejitsu。

在移动设备上,我使用移动设备和wifi检查了http://websocketstest.com/上的端口。在移动设备上,端口80和8080的测试失败 我想也许我可以将端口更改为443但是即使我将server.listen()设置为端口443,nodejitsu似乎也会侦听端口80。

我认为WebSockets可能是通过另一个端口实现的,但我不知道如何更改端口或者为什么nodejitsu只是在监听端口80。

3 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

您的node.js应用程序使用websockets并在本地和通过wifi网络工作。当使用移动数据网络时,它失败了502.这是我回答的不是heroku / nodejitsu编辑的问题。

最可能的原因是网络中的跳跃不良,例如反向代理。要通过反向代理使用Websockets,必须使用http1.1并在connect上升级以从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);

我还找到了一个有用的introduction to SSL/TLS,其中包含有关如何获得免费证书的说明。