使用 Node.js 和 Socket.io 将更改推送到所有客户端

Posted

技术标签:

【中文标题】使用 Node.js 和 Socket.io 将更改推送到所有客户端【英文标题】:Pushing changes to all clients with Node.js and Socket.io 【发布时间】:2013-11-17 15:00:26 【问题描述】:

我有一个使用套接字的工作服务器。我的服务器端代码如下所示:

io.sockets.on('connection', function(socket) 
  socket.emit('status',  counter: count );
);

在此示例中,我只是将计数器每分钟增加 1。当计数器更新时,我想将当前计数发送给所有客户端。我的index.html 文件如下所示:

<script>
var socket = io.connect('http://localhost');
socket.on('status', function (data) 
  console.log(data);
);
</script>

当我启动服务器时,我可以看到第一个数据发送到客户端'counter': 0,但是当计数器的值增加时,我看不到客户端上正在更新的新值。为什么没有向我的客户发送新数据?

【问题讨论】:

http://***.com/questions/7352164/… 【参考方案1】:

您仅在连接时发出信息。例如,如果您只想每分钟广播一次信息 - 只需将您的代码更改为:

io.sockets.on('connection', function(socket) 
  setInterval(function() 
    socket.emit('status',  counter: count );
  , 60 * 1000);
);

这将在连接时创建一个间隔,然后每分钟发出一次消息。

如果你想要更高级的东西,例如监听计数的变化,你需要使用更高级的机制订阅它的变化。

更新

实现此目的的另一种方法是在计数器更改时发出(使用更新它的相同函数)。

还有一种方法是使用实​​验性的observe feature on a javascript object。

【讨论】:

【参考方案2】:

这个问题已经回答了。

见:Update all clients using Socket.io?

基本信息是:您需要从全局套接字 io 而不是单个套接字发出消息。

socket.emit() 只发射到一个套接字。 io.socket.emit() 会将消息发送到所有套接字(广播消息)。

【讨论】:

以上是关于使用 Node.js 和 Socket.io 将更改推送到所有客户端的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 使用 socket.io 进行重构

如何将 Asterisk ARI 与 socket.io 和 Node.js 一起使用

Node.js、多线程和 Socket.io

Socket.io 使用 node.js,根本没有 express?

node.js、socket.io 和 SSL

node.js + socket.io:拍卖网站开发