在Heroku上部署我的应用程序破坏了websockets协议。
它在localhost上工作,而不是在Heroku上。在浏览器中,我得到:
到'wss:/node-omi.herokuapp.com/socket.io/?eio=2&transport=WebSocket&sid=*'的WebSocket连接失败:WebSocket握手期间出错:意外响应代码:503
在服务器端,我获得日志:
2014-08-12T15:05:24.761611+00:00 Heroku[router]:at=error code=h13 desc=“Connection closed with response”method=get path=“/socket.io/?eio=2&transport=websocket&sid=****”host=node-omi.herokuapp.com request_id=*fwd=“*”dyno=web.1 connect=3ms service=3ms status=503 bytes=864
这是我的服务器脚本的一部分:
var express = require('express'),
http = require('http'),
socket_io = require('socket.io');
var app = express(),
server = http.Server(app),
io = new socket_io(server).of('/test');
io.on('connection', this.connection.bind(this));
app.get('/client.html', function(req, res, next) { ... });
app.use('/', express.static(__dirname + '/public', {'index': ['index.html']}));
server.listen(process.env.PORT || 5000);
我的代码怎么了?有人成功地用Express4.8.3和Socket.io 1.0.6构建Socket.io服务器吗?套接字与轮询一起工作,但我确实需要websockets才能工作。谢谢回复。
Heroku上的Websocket支持从beta到正式支持,所以在写这篇文章的时候,修复程序可能只是labs:enable websockets
,但您应该不再需要这样做了,您就可以获得现成的websockets了。
警告!
但作为对阅读此问题的其他人的一个警告,在Heroku上使用socket.io可能会有问题,因为在粘性会话方面存在分歧
Heroku明确反对它们,但是(除了下面描述的一个相当糟糕的解决办法)socket.io需要它们:
https://github.com/automattic/engine.io/issues/261
^TL;DR如果这个非常长的线程是在V1.0之前,socket.io可以与Heroku这样的非粘性服务一起工作,那么您只需要使用一个redis适配器来管理Dynos上的共享状态。这在1.0中被删除了,socket.io团队担心会因为代码维护成本而把它放回去。github要求收回它的问题已经结束,并传达了这样一个信息:一旦有人非常想要它来做公关,他们会很乐意调查它。
变通办法!
有一个解决办法是将socket.io限制为只使用websocket传输,这不需要粘性会话。例如:
服务器:
io.set('transports', ['websocket']);
客户
var socket = io.connect(host, {
transports: ['websocket']
});
但是,这消除了Socket.io1.0使用Engine.io带来的许多好处。
还有其他websocket框架,如Faye,在Heroku上工作得非常好。