我可以在heroku上设置socket.io聊天吗?

时间:2011-06-03 06:44:53

标签: sockets node.js heroku socket.io

我有一个简单的socket.io聊天应用程序,我上传到其中一个新的Heroku 'cedar'堆栈。

现在我几乎把一切都搞定了,但我遇到了一个绊脚石。在我的localhost上,我使用以下命令打开与客户端的套接字服务器的连接:

// lots of HTML omitted
socket = new io.Socket('localhost', {port: 8888});

但是在Heroku上,我显然必须用其他东西代替这些值。

我可以从服务器上的进程对象获取端口,如下所示:

port = process.env.PORT || 8888

并将其传递给视图。

但我该如何替代'localhost'

7 个答案:

答案 0 :(得分:21)

根据heroku article的正确方法是:

io.configure(function () { 
  io.set("transports", ["xhr-polling"]); 
  io.set("polling duration", 10); 
});
socket = new io.Socket();

这可确保io.Socket不会尝试使用WebSockets。

答案 1 :(得分:14)

通过执行以下操作,我能够让Socket.IO v0.8在Heroku Cedar上工作:

在Express应用程序中(在我的案例中为CoffeeScript):

app = express.createServer();
socket = require("socket.io")

...

io = socket.listen(app);
io.configure () ->
  io.set("transports", ["xhr-polling"])
  io.set("polling duration", 10)

io.sockets.on('connection', (socket) ->
  socket.on('myaction', (data) ->
    ...
    socket.emit('result', {myData: data})

### The port setting is needed by Heroku or your app won't start
port = process.env.PORT || 3000;
app.listen(port);


在您的应用程序的前端Javascript中:

var socket = io.connect(window.location.hostname);
function sendSocketRequest() {
  socket.emit('myaction', $("#some_field").val());
}

socket.on('result', function(data) {
  console.log(data);
}

有用的链接:

答案 2 :(得分:9)

截至2013年10月,这已经发生了变化,heroku已经添加了websocket支持:

https://devcenter.heroku.com/articles/node-websockets

使用:

heroku labs:enable websockets

启用websockets并且不要忘记删除:

io.configure(function () { 
  io.set("transports", ["xhr-polling"]); 
  io.set("polling duration", 10); 
}); 

答案 3 :(得分:6)

在阳光下尝试每一个组合后,我终于把它留空了。瞧,这看起来很完美。你甚至不需要这个端口。

socket = new io.Socket();

答案 4 :(得分:2)

我在heroku上也有这个问题。我能够使用主机名“myapp.herokuapp.com”(或者只是window.location.hostname,在本地和生产中工作)并将端口设置为80来使其工作。我正在使用SocketIO 0.6.0。

答案 5 :(得分:0)

你不会只是把你的实际主机名?

答案 6 :(得分:0)

2011-06-25T21:41:31+00:00 heroku[router]: Error H13 (Connection closed without response) -> GET appxxxx.herokuapp.com/socket.io/1/websocket/4fd434d5caad5028b1af690599f4ca8e dyno=web.1 queue= wait= service= status=503 bytes=

这是否意味着应用程序前面的heroku路由器未配置为处理Web套接字流量?

<强> [更新] 从2011年6月22日开始,答案是肯定的...... heroku不支持socket.io看到这篇文章:http://blog.heroku.com/archives/2011/6/22/the_new_heroku_2_node_js_new_http_routing_capabilities/