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。

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

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

4

3 回答 3

3

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

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

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

io.set('transports', [ 'xhr-polling', 'jsonp-polling', 'htmlfile' ]);
于 2013-11-26T18:16:11.583 回答
1

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

最可能的原因是网络中的不良跃点,例如反向代理。要通过反向代理使用 Websockets,您必须使用 http1.1 并在连接时升级以从 http 协议转到 ws 协议。一些代理(还)不支持http升级,其他一些东西(例如@roberklep Opera Turbo)使websockets无法工作。

从端口 80 上的 http 移动到端口 443 上的 https(使用 SSL,现在称为 TLS)在传输层加密数据。大多数不良跃点都设置为直接发送数据,从而解决您的问题。

我发现另一个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 介绍,其中包括有关如何获得免费证书的说明。

于 2014-05-09T15:00:40.887 回答
1

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

var io= require('socket.io');
io.set("transports", ["xhr-polling"]);
于 2013-11-26T18:15:56.943 回答