移动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"]);