是否有可能发送消息到所有活动的WebSocket连接? 使用node.js或python龙卷风websockets

我正在尝试构build一个基于websocket的应用程序。

我想知道是否有可能发送消息到所有活动的连接,因为他们是持久的。

说我正在运行一个现场拍卖网站,我有多个用户在观看拍卖页面,每个用户都通过套接字连接到我的服务器。 现在让我们说一个用户提高出价。 我想发送消息给所有连接的客户端。 最简单的方法是让客户端每秒钟通过套接字轮询服务器,但是我认为websockets的思想是要有真正的双向通信。

如何才能做到这一点?

提前致谢,

ROTEM

socket.io解决scheme:

// note, io.listen() will create a http server for you var io = require('socket.io').listen(80); io.sockets.on('connection', function (socket) { io.sockets.emit('this', { will: 'be received by everyone' }); socket.on('private message', function (msg) { console.log('I received a private message from ', socket.id, ' saying ', msg); // Echo private message only to the client who sent it socket.emit('private message', msg); }); socket.on('disconnect', function () { // This will be received by all connected clients io.sockets.emit('user disconnected'); }); }); all_active_connections = {}; 

webocket服务器 (有很多 ),手动做同样的事情:

  var ws = require("ws"); global_counter = 0; all_active_connections = {}; ws.createServer(function (websocket) { websocket.on('connect', function() { var id = global_counter++; all_active_connections[id] = websocket; websocket.id = id; }).on('data', function (data) { if (data == 'broadcast me!') { for (conn in all_active_connections) all_active_connections[conn].write(data); } } }).on('close', function() { delete all_active_connections[websocket.id]; }); }).listen(8080); 

对于基于龙卷风/龙卷风的解决scheme,SocketConnection类需要在类级别维护一个连接列表。 你的on_connect处理程序会将连接添加到这个列表中,on_close会删除它。 对于示例伪代码,请参阅Serge S. Koval的这篇文章 。 代码重现如下:

声明你的TornadIO连接类:

 class MyConnection(SocketConnection): participants = set() @classmethod def broadcast(cls, msg): for p in cls.participants: p.send(msg) @classmethod def controller_msg(cls, msg): cls.broadcast(msg) 

在您的设备轮询线程中,执行如下操作:

 while True: datum = file.readline() if len(datum) > 2: t = json.loads(datum) ... def callback(): MyConnection.controller_msg(t) io_loop.add_callback(callback) 

此外, gevent-socketio支持消息广播,但它基于gevent,而不是龙卷风。

更新:

tornadio2已经维护了一个活动会话列表,所以你需要做的是:

 class MyConnection(SocketConnection): def broadcast(self, event, message): for session_id, session in self.session.server._sessions._items.iteritems(): session.conn.emit(event, message) 

这是可行的,因为每个连接实例都有一个对其会话的引用,该会话引用了用于创build应用程序(存储为server )的全局路由器,该应用程序在_sessions中的SessionContainer对象中维护会话列表。 现在,只要你想在你的连接类中广播一条消息,就可以:

 self.broadcast('my_custom_event', 'my_event_args') 

这个redis + websockets(龙卷风)例子应该可以帮到你。 基本上你有一个应该被通知的听众列表,一旦收到一条消息,就会遍历这个列表并通知他们。