node.js+;socket.io从服务器而不是从特定客户端广播?
我正在使用node.js+socket.io构建一个简单的系统,比如实时新闻提要 由于这是一个“只读”系统,客户机连接并接收数据,但客户机从未实际发送自己的任何数据。服务器生成需要发送给所有客户端的消息,没有客户端生成任何消息;但我确实需要广播 (页末)写着 要进行广播,只需将node.js+;socket.io从服务器而不是从特定客户端广播?,node.js,socket.io,Node.js,Socket.io,我正在使用node.js+socket.io构建一个简单的系统,比如实时新闻提要 由于这是一个“只读”系统,客户机连接并接收数据,但客户机从未实际发送自己的任何数据。服务器生成需要发送给所有客户端的消息,没有客户端生成任何消息;但我确实需要广播 (页末)写着 要进行广播,只需将broadcast标志添加到emit和send方法调用。广播意味着向除启动它的套接字之外的所有人发送消息 因此,我当前捕获了最新的客户端,将其连接到一个变量中,然后将emit()连接到该套接字,并将broadcast.em
broadcast
标志添加到emit
和send
方法调用。广播意味着向除启动它的套接字之外的所有人发送消息
因此,我当前捕获了最新的客户端,将其连接到一个变量中,然后将emit()
连接到该套接字,并将broadcast.emit()
连接到该套接字,这样这个新客户端将获得新数据和所有其他客户端。但感觉客户端在这里的角色只不过是我认为socket.io已经支持的解决方案
是否有一种方法可以根据服务器启动的事件向所有客户端发送数据
我目前的做法大致如下:
var socket;
io.sockets.on("connection", function (s) {
socket = s;
});
/* bunch of real logic, yadda yadda ... */
myServerSideNewsFeed.onNewEntry(function (msg) {
socket.emit("msg", { "msg" : msg });
socket.broadcast.emit("msg", { "msg" : msg });
});
基本上,导致数据需要发送到客户端的事件都是服务器端的,而不是客户端的。因为您只在服务器端发送事件,所以应该为服务器创建自定义事件
var io = require('socket.io').listen(80);
events = require('events'),
serverEmitter = new events.EventEmitter();
io.sockets.on('connection', function (socket) {
// here you handle what happens on the 'newFeed' event
// which will be triggered by the server later on
serverEmitter.on('newFeed', function (data) {
// this message will be sent to all connected users
socket.emit(data);
});
});
// sometime in the future the server will emit one or more newFeed events
serverEmitter.emit('newFeed', data);
注意:newFeed
只是一个事件示例,您可以拥有任意数量的事件
重要
上面的解决方案更好,因为将来您可能只需要向某些客户机发出某些消息,而不是全部(因此需要条件)。对于更简单的事情(不管发生什么,只要向所有客户端发送消息),
io.sockets.broadcast.emit()
确实更适合。为什么不像下面这样做呢
io.sockets.emit('hello',{msg:'abc'});
啊,我以前也做过类似的事情,虽然更多的是传统的观察者设计模式(这是我第一天使用node),但我担心循环效率低下。新消息每7秒向大约10000个客户端广播一次。我假设广播使用了一种有效的算法,但可能只是一种抽象。我试试你的方法;)有点离题了,但我需要处理断开连接,还是socket.io/node会帮我处理它?似乎我最终会使用死掉的事件观察器。您不需要处理断开连接。当我尝试时,我得到一个错误,即
io.sockets.emit
不是一个定义的函数。嗯,似乎我实际上尝试了io.sockets.broadcast.emit()
,我的错,这似乎确实有效!我将更改所选答案,因为这要简单得多,谢谢。如果您有一些简单的方法确实可以使用,如果您需要迭代套接字并仅在满足特定条件时发送消息,那么我的解决方案更通用。从v1.0.4开始,我可以简单地编写io.emit('hello',{msg:'abc'))
而且它也能正常工作。