在Heroku上部署我的应用程序打破了websockets协议 它适用于localhost,而不适用于Heroku。在浏览器中,我得到:
WebSocket连接到' wss://node-omi.herokuapp.com/socket.io/?EIO = 2& transport = websocket& sid = * '失败:WebSocket握手期间出错:意外的响应代码:503
在服务器端,我进入了日志:
2014-08-12T15:05:24.761611 + 00:00 heroku [router]:at = error code = H13 desc ="连接关闭但没有响应" 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);
我的代码出了什么问题?有没有人成功使用Express 4.8.3和Socket.io 1.0.6构建socket.io服务器?套接字使用轮询,但我真的需要websockets才能工作。谢谢你的回复。
答案 0 :(得分:2)
Heroku上的Websocket支持已从测试版发布到官方支持,因此在本文发布时,修复可能仅仅是labs:enable websockets
但是你不再需要这样做了,你得到的是websockets盒子。
警告!强>
但作为对其他人阅读此问题的警告,在Heroku上使用socket.io可能会出现问题,因为sticky sessions 之间存在分歧
Heroku显然代表against them但是(缺少下面描述的相当糟糕的解决方法)socket.io需要它们:
https://github.com/Automattic/engine.io/issues/261
;如果这个非常长的线程是在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.io 1.0使用engine.io带来的许多好处。
还有其他一些像Faye这样的websocket框架在Heroku上非常好用。