我建立一个实时的Web应用程序。 我希望能够从服务器端实现我的Python应用程序发送广播消息。
下面是设置:
- socketio.js在客户端
- TornadIO2服务器Socket.IO服务器
- 在服务器侧蟒 ( Django的框架)
我可以成功地从客户端发送socket.io消息发送到服务器。 服务器处理这些,并且可以发送响应。 在下文中,我将介绍我是如何做到这一点。
当前设置和代码
首先,我们需要确定哪些处理socket.io事件连接:
class BaseConnection(tornadio2.SocketConnection):
def on_message(self, message):
pass
# will be run if client uses socket.emit('connect', username)
@event
def connect(self, username):
# send answer to client which will be handled by socket.on('log', function)
self.emit('log', 'hello ' + username)
启动服务器由一个Django管理自定义的方法来完成:
class Command(BaseCommand):
args = ''
help = 'Starts the TornadIO2 server for handling socket.io connections'
def handle(self, *args, **kwargs):
autoreload.main(self.run, args, kwargs)
def run(self, *args, **kwargs):
port = settings.SOCKETIO_PORT
router = tornadio2.TornadioRouter(BaseConnection)
application = tornado.web.Application(
router.urls,
socket_io_port = port
)
print 'Starting socket.io server on port %s' % port
server = SocketServer(application)
很好,现在服务器上运行。 让我们添加的客户端代码:
<script type="text/javascript">
var sio = io.connect('localhost:9000');
sio.on('connect', function(data) {
console.log('connected');
sio.emit('connect', '{{ user.username }}');
});
sio.on('log', function(data) {
console.log("log: " + data);
});
</script>
显然{{ user.username }}
将由的当前登录的用户,在这个例子中,用户名是“高山”用户名替换。
现在,每次页面被刷新时,控制台输出为:
connected
log: hello alp
因此,调用消息和发送响应工作。 但现在到了棘手的部分。
问题
响应“你好ALP”仅被发送到socket.io消息的调用。 我想,如果一个新用户加入队伍(例如,在一个聊天应用)广播消息给所有连接的客户端,以便他们可以实时通知。
所以,这里是我的问题:
我怎么能发送广播消息到所有连接的客户端?
我怎么能发送广播消息给多个连接的客户端所上的特定频道订阅?
如何我在Python代码的任何地方发送广播消息(外面的
BaseConnection
类)? 这会需要某种Socket.IO客户端的蟒蛇,或者这是内置有TornadIO2?
所有这些节目应以可靠的方式来完成,所以我猜的WebSockets是最好的选择。 但我向所有人开放的良好解决方案。