0

对于 http 持久连接,我编写了以下代码:

class LongPolling(tornado.web.RequestHandler):
    waiters = set()
    def get(self):
        LongPolling.waiters.add(self)
        for x in LongPolling.waiters:
            x.write("Broadcast all")
            x.flush()
        return

    def on_close(self):
        logging.warning("Connection closed *********")
        LongPolling.waiters.remove(self)

if __name__ == "__main__":
    application = tornado.web.Application([
        (r"/", LongPolling),
    ])
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

每次有新连接出现时,我都会进行广播。但问题是,在get()连接关闭后立即进行。

那么如何在 get() 调用后让连接打开?

4

1 回答 1

2

没有所谓的“持久”http 连接。标Connection: keep-alive头允许客户端和服务器在不创建新的底层 tcp 连接的情况下执行新的 http 请求/响应循环,以节省一点网络流量,但这对应用程序不可见;通常由反向代理在服务器端实现。当客户收到对他们的 GET 的响应时,他们将不得不提出新的请求。

如果这不是您的想法,只是您想一次响应一些请求,那么您可能正在寻找tornado.web.asynchronous. 但是请注意,大多数浏览器内的客户端不会从中受益很多。例如,XHR 在响应完成之前不会被触发,因此浏览器应用程序无论如何都必须启动新请求

于 2013-01-02T20:55:34.077 回答