Сокет.io не отправляет сообщение на все подключенные сокеты

#node.js #socket.io

#node.js #socket.io

Вопрос:

Я пытаюсь node.js и socket.io . Я не хочу использовать для удаления функции ping, которую я должен получать обновления со своего сервера. Вот пример кода того, что я делаю:

 var app = require('http').createServer(),
    io  = require('socket.io').listen(app),
    cp  = require('child_process');

app.listen(8080);

//I check a global value for all the connected users from the php command line
var t = setInterval(function(){
  cp.exec('/usr/bin/php /Users/crear/Projects/MandaFree/symfony api:getRemainingMessages',
    function(err, stdout){
      if (err) {
        io.sockets.emit('error', 'An error ocurred while running child process.');
      } else {
        io.sockets.emit('change', stdout);
      }
      console.log('Remaining messages: '   stdout);
    });
  }, 3000);

var remaining =  io.of('/getRemainingMessages')
  .on('connection', function(socket){
    socket.on('disconnect', function(){});
  });
  

Проблема здесь в том, что когда я вызываю io.sockets.emit(), консоль отладки сообщает мне, что она что-то делает, но, похоже, это не доходит до клиентов. Потому что они ничего не делают.

Я использую один интервал для каждого подключенного клиента, и когда я использовал socket.emit(), это сработало. Но это не оптимальное решение.

ОБНОВЛЕНИЕ: вот мой код на стороне клиента.

 var remaining = io.connect('http://127.0.0.1:8080/getRemainingMessages');
remaining.on('change', function(data){
  console.log('Remaining messages: '   data );
  $('#count').html(data);
});
remaining.on('error', function(error){
  console.log(error);
});
  

Комментарии:

1. В вашем клиентском коде есть обработчики для обоих error и change ? Вы можете включить этот код здесь, который может помочь определить проблему.

2. @Fosco Я обновил и добавил код на стороне клиента. Раньше это работало, когда цикл зависел от конфигурации сокета на сервере. Когда я изменил его только на один цикл и отправил сообщение каждому, он перестал работать.

Ответ №1:

Пару дней назад возникла очень похожая проблема, и она выглядит как сокет.у io были некоторые изменения в API. Я никогда не работал с symfony и надеюсь, что проблемы те же.

У меня есть рабочая демонстрация сокета.io отправка и получение сообщения — загружено в https://github.com/parj/node-websocket-demo в качестве эталона

По сути, два изменения

  1. На стороне сервера — изменено socket.on на socket.sockets.on

     var socket = io.listen(server);
    socket.sockets.on('connection', function(client)
      
  2. На стороне клиента — URL и порт не требуются, поскольку они автоматически определяются.

     var socket = io.connect();
      

Это было протестировано с использованием Express 2.5.2 и Socket.io 0.8.7

Я объединил ваш серверный код с моим, не могли бы вы попробовать это на сервере и моем клиентском javascript и клиентском html, просто чтобы посмотреть, работает ли это?

 var socket = io.listen(server);

socket.sockets.on('connection', function(client){
  var connected = true;

  client.on('message', function(m){
    sys.log('Message received: ' m);
  });

  client.on('disconnect', function(){
    connected = false;
  });

  var t = setInterval(function(){
  if (!connected) {
      return;
  }

  cp.exec('/usr/bin/php /Users/crear/Projects/MandaFree/symfony api:getRemainingMessages',
    function(err, stdout){
      if (err) {
        client.send('error : An error ocurred while running child process.');
      } else {
        client.send('change : '   stdout);
      }
      console.log('Remaining messages: '   stdout);
    });
  }, 3000);

  t();

});