【问题标题】:Socket.io not sending a message to all connected socketsSocket.io 未向所有连接的套接字发送消息
【发布时间】:2011-10-02 16:29:04
【问题描述】:

我正在试用 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);
});

【问题讨论】:

  • 在您的客户端代码中,是否有errorchange 的处理程序?您可以在此处包含该代码,这可能有助于确定问题。
  • @Fosco 我更新并添加了客户端代码。它曾经在循环位于服务器中的套接字配置上时工作。当我将其更改为仅一个循环并将消息发送给它停止工作的每个循环时。

标签: node.js socket.io


【解决方案1】:

几天前遇到了一个非常相似的问题,看起来 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();
    

已经使用 Express 2.5.2 和 Socket.io 0.8.7 进行了测试

我已将您的服务器代码与我的合并,您能否在服务器和我的client javascriptclient 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();

});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-04
    • 2017-07-01
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多