Можно ли настроить чат socket.io на героку? - PullRequest
28 голосов
/ 03 июня 2011

У меня есть простое приложение для чата socket.io, которое я загрузил в один из новых Heroku 'cedar' стеков.

Теперь у меня почти все работает, но я наткнулся на один камень преткновения. На моем локальном хосте я открываю соединение с сервером сокетов от клиента с помощью:

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

Но на Heroku я, очевидно, должен заменить что-то еще на эти значения.

Я могу получить порт от объекта процесса на сервере следующим образом:

port = process.env.PORT || 8888

и передайте это в представление.

Но чем мне заменить 'localhost'?

Ответы [ 7 ]

21 голосов
/ 26 августа 2011

Правильный путь согласно статье на героку:

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

Это гарантирует, что io.Socket не будет пытаться использовать WebSockets.

14 голосов
/ 25 ноября 2011

Мне удалось заставить 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);
}

Полезные ссылки:

9 голосов
/ 09 октября 2013

Это изменилось по состоянию на октябрь 2013, heroku добавили поддержку веб-сокетов:

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

Использование:

heroku labs:enable websockets

Чтобы включить веб-сокеты и не забудьте удалить:

io.configure(function () { 
  io.set("transports", ["xhr-polling"]); 
  io.set("polling duration", 10); 
}); 
6 голосов
/ 03 июня 2011

Попробовав каждую комбинацию под солнцем, я, наконец, просто оставил это поле пустым. И вот, это работает отлично. Вам даже не нужен порт.

socket = new io.Socket();
2 голосов
/ 07 июля 2011

У меня тоже была эта проблема на героку.Я смог заставить его работать, используя имя хоста "myapp.herokuapp.com" (или просто window.location.hostname, для работы как локально, так и в производстве) и установив порт на 80. Я использую SocketIO 0.6.0.

0 голосов
/ 26 июня 2011

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 в приложении не настроен для обработки трафика веб-сокетов?

[обновление] Похоже, что по состоянию на 22.06.2011 ответ - да ... heroku не поддерживает socket.io смотрите этот пост: http://blog.heroku.com/archives/2011/6/22/the_new_heroku_2_node_js_new_http_routing_capabilities/

0 голосов
/ 03 июня 2011

Не могли бы вы просто указать свое действительное имя хоста?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...