我正在构建一个实时Web应用程序。 我希望能够从Python应用程序的服务器端实现发送广播消息。
以下是设置:
- 客户端使用socketio.js
- 作为Socket.IO服务器的TornadIO2
- 服务器端使用python(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 }}
将被当前已登录用户的用户名所替代,在此示例中用户名为"alp"。
现在,每次页面刷新时,控制台输出如下:
connected
log: hello alp
因此,调用消息和发送响应可以正常工作。但现在来到了棘手的部分。
问题
响应“hello alp”仅发送给socket.io消息的调用者。我希望向所有连接的客户端广播消息,以便实时通知他们新用户加入聊天室(例如在聊天应用程序中)。
所以,这里是我的问题:
如何将广播消息发送给所有连接的客户端?
如何将广播消息发送给订阅特定频道的多个连接的客户端?
如何在我的Python代码中的任何位置发送广播消息(在
BaseConnection
类之外)?这是否需要一些用于Python的Socket.IO客户端或内置于TornadIO2中?
所有这些广播都应该以可靠的方式完成,因此我认为WebSockets是最佳选择。但我对所有好的解决方案持开放态度。