Socket.io没有向所有连接的套接字发送消息

时间:2011-10-02 16:29:05

标签: 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 个答案:

答案 0 :(得分:2)

几天后发生了一个非常类似的问题,看起来像socket.io在API中有一些变化。我从未使用过symfony,我希望问题是一样的。

我有一个socket.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();
    
  3. 已使用Express 2.5.2和Socket.io 0.8.7

    对此进行了测试

    我已经将您的服务器代码与我合并,您是否可以在服务器和我的client javascript以及client 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();
    
    });