如何使用龙卷风发送 HTTP 广播消息?

How can I send HTTP broadcast message with tornado?

我有一个 tornado HTTP 服务器。

如何使用 tornado 服务器实现 broad-cast 消息?

是否有任何功能,或者我只需要向所有客户端循环发送普通的 HTTP 消息。

我想如果我发送正常的 HTTP 消息,服务器应该等待响应。

好像不是broad-cast的概念。

否则,我需要另一个第三方选项 broad-cast?

请给我任何实施 broad-cast 消息的建议。

简短回答:您可能对 WebSockets 感兴趣。 Tornado 似乎对此有支持。

更长的答案:我假设您指的是从服务器向所有客户端广播。 不幸的是,由于考虑的方式,这在 HTTP/1.1 中在概念上是不可行的。客户端向服务器请求一些东西,服务器响应,独立于其他所有。

此外,虽然客户端和服务器之间没有请求,但可以说这种关系根本不存在。因此,如果您要广播,您将错过当前未与服务器通信的客户端。

诚然,事情并没有那么简单。许多客户端在与服务器通信时保持长期的 TCP 连接,并在其上传输 HTTP 请求。此外,单个请求不是原子的,响应是以数据包的形式发送的。人们在 WebSockets 之前实现了 server-push/long-polling 或使用这种方法实现了 HTTP/2,但现在有更好的方法来解决这个问题。

Tornado 中没有广播消息的内置概念。 Tornado 附带的 websocket 聊天演示演示了如何遍历向每个客户端发送消息的客户端列表:

def send_updates(cls, chat):
    logging.info("sending message to %d waiters", len(cls.waiters))
    for waiter in cls.waiters:
        try:
            waiter.write_message(chat)
        except:
            logging.error("Error sending message", exc_info=True)

https://github.com/tornadoweb/tornado/blob/master/demos/websocket/chatdemo.py