移动networking上的端口8080或80上的WebSocket连接失败

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

当我testet应用程序本地或在我的wifinetworking一切都很好,但自从我切换到移动数据我得到连接错误:

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

看来我的移动提供商阻止端口8080和80,但切换到另一个端口似乎不可能与nodejitsu。

有一些经验,如何处理移动networking,node.js和socket.io?

编辑:
作为主机,我尝试免费订阅Heroku和免费订阅Nodejitsu。

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

我认为WebSockets可能可能通过另一个端口,但我不知道如何改变端口或为什么nodejitsu例如只是听80端口。

HTTP 502的意思是“错误的网关”,通常是在客户端和服务器之间的path上的反向代理的标志。

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

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

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

最可能的原因是networking中的一个不好的跳跃,例如一个反向代理。 要通过反向代理使用Websockets,您必须使用http1.1并在连接上升级以从http转到ws协议。 有些代理不支持http升级,还有一些其他的东西(例如@roberklep Opera Turbo),所以websocket不起作用。

从端口80上的http转移到端口443上的https(使用现在称为TLS的SSL)将encryption传输层上的数据。 大部分这些糟糕的中继都是通过直接发送数据来清除问题的。

我发现另一个StackOverflow Q&A,显示了一些在node.js中设置https的代码。这个post的关键是:

 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介绍 ,包括如何获得免费证书的说明。

您必须设置数据传输configuration:

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