对于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()调用之后让连接打开?
答案 0 :(得分:2)
没有“持久”的http连接。 Connection: keep-alive
标头允许客户端和服务器执行新的http请求/响应周期而不创建新的底层tcp连接,以节省一些网络流量,但这对应用程序是不可见的;并且通常由反向代理在服务器端实现。客户在收到对其GET的回复时,必须提出新请求。
如果这不是您的想法,只是您想要一次回应一些请求,那么您可能正在寻找tornado.web.asynchronous
。但请注意,大多数浏览器内客户都不会从中受益;例如,在响应完成之前,不会触发XHR,因此浏览器应用程序必须启动新请求