在我的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。
答案 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,其中包含有关如何获得免费证书的说明。