Can I set up socket.io chat on heroku?

17,076

Solution 1

This has now changed as of Oct 2013, heroku have added websocket support:

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

Use:

heroku labs:enable websockets

To enable websockets and dont forget to remove:

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

Solution 2

The correct way according the article on heroku is:

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

This ensures that io.Socket won't try to use WebSockets.

Solution 3

I was able to get Socket.IO v0.8 to work on Heroku Cedar by doing the following:

Within the Express app (in CoffeeScript in my case):

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);


And within the front-facing Javascript of your application:

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

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

Helpful links:

Solution 4

After trying every combination under the sun I finally just left it blank. Lo and behold that works perfectly. You don't even need the port.

socket = new io.Socket();

Solution 5

I was also having this problem on heroku. I was able to make it work using the hostname "myapp.herokuapp.com" (or simply window.location.hostname, to work both local and in production) and setting the port to 80. I'm using SocketIO 0.6.0.

Share:
17,076
David Tuite
Author by

David Tuite

Founder and CEO of Developer Portal company roadie.io

Updated on July 08, 2022

Comments

  • David Tuite
    David Tuite almost 2 years

    I have a simple socket.io chat application which I've uploaded to one of the new Heroku 'cedar' stacks.

    Now I almost have everything working but I've hit one stumbling block. On my localhost, I open a connection to the socket server from the client with:

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

    But on Heroku, I obviously must substitute something else in for these values.

    I can get the port from the process object on the server like so:

    port = process.env.PORT || 8888
    

    and pass that to the view.

    But what do I substitute for 'localhost'?