Socket.on('connection'... событие никогда не запускалось nodejs + express + socket.io

Проблема socket.io НЕ работает

Подробнее

  • Сгенерирован проект с express [folder]; cd [folder]; npm install;
  • Настройка socket.io npm install socket.io
  • Запустите node приложение с кодом ниже
  • Клиент connect запускает событие, но сервер соединение НИКОГДА не запускается.

Настройка

  • Сервер AWS Free Tier, Ubuntu 11.10, ami-a7f539ce
  • nodejs v0.6.5
  • express v2.5.1
  • socket.io v0.8.7

Client

 var socket = io.connect('http://example.com:3000');

 socket.on('connect', function() { 
    console.log('connected');
 });

 socket.on('message', function(msg){
    console.log(msg);
 });

 socket.on('disconnect', function() {
    console.log('disconnected');
 });

 socket.on('error', function (e) {
    console.log('System', e ? e : 'A unknown error occurred');
 });

Сервер

 [...]

 app.listen(3000);

 // socket.io setup
 var socket = require('socket.io').listen(app);

 // socket.io connection establishment
 socket.on('connection', function (client) {
    client.send("hello");
    console.log("hello", client);           
 });

Почему событие соединение никогда не запускается?

Ответ 1

Понадобилось время, чтобы заметить... событие connection приведено в io.sockets. В вашем коде это будет

socket.sockets.on('connection', function (client) {
  client.send("hello")
  console.log("hello", client)
})

Вы должны использовать io вместо socket как имя var, чтобы избежать этой путаницы.

Ответ 2

Рикардо Томаси прав, спас мою жизнь, я сошел с ума.

Если бы все изменилось, мы в 2013 году, все еще проблема открылась (с 2 лет) в этом

возможно, что-то изменилось, так или иначе, чтобы зарегистрировать событие "connect", я должен был сделать это:

var openSocket = function (uniqueID) {
  var appSocket = io.connect('/'+uniqueID, { transports: ['websocket', 'xhr-polling']});
  appSocket.socket.on('connect', function () {
    console.log('i did connect.');
  });
  return appSocket;
};

Ответ 3

Следующее сделало для меня трюк: socket.io-client: "^ 0.9.16"

io.connect("http://localhost:4000", {'force new connection': true});

Событие "connect" постоянно срабатывает, и повторного использования не происходит.

Я понял эту опцию, исследуя строку socket.io-client/lib/io.js: 192 Поскольку я даже не могу найти этот файл io.js в github, я думаю, что в будущих выпусках есть рефакторинг, и этот вариант может не работать.

По крайней мере, это может быть полезно для тех, кто будет заниматься этой временной работой.