2013-01-02 3 views
0

는 다음 코드 작성 :토네이도 (파이썬) : HTTP 영구 연결에 대한 지속적인 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() 

나는 새 연결이 올 때마다 braodcasting 오전 ..하지만이 문제는 get() 직후입니다 연결이 닫힙니다.

그래서 get()을 호출 한 후 연결을 열 수 있습니까?

+1

당신은 [Socket.io의 토네이도 구현 (HTTPS를 사용하여 고려할 수 있습니다 : // github.com/MrJoes/tornadio) 당신의 목적에 과도하지 않다면. –

+0

토네이도가 이러한 유형의 영구 연결을 지원하지 않는다는 뜻입니까? – user739711

+0

@TokenMacGuy 내가 여기서 언급 한 것은 소켓 연결을 유지하는 방법이 있는지, 그래서 나중에 쓰는 방법이다. – user739711

답변

2

"지속적인"http 연결과 같은 것은 없습니다. Connection: keep-alive 헤더는 클라이언트와 서버가 네트워크 트래픽을 약간 줄이기 위해 새로운 기본 tcp 연결을 만들지 않고 새로운 http 요청/응답주기를 수행 할 수 있도록 허용하지만 응용 프로그램에는 보이지 않습니다. 일반적으로 리버스 프록시에 의해 서버 측에서 구현됩니다. 고객은 GET에 대한 응답을 받으면 새로운 요청을해야합니다.

마음에 그게 아니라면, 한 번에 조금씩 요청에 응답하고 싶다면 tornado.web.asynchronous을 찾고있을 수도 있습니다. 그러나 대부분의 브라우저 내 클라이언트는이 점을별로 고려하지 않습니다. XHR의 예를 들어이 완료 응답 할 때까지 해고되지 않으므로 브라우저 응용 프로그램 어쨌든 새로운 요청 을 시작해야합니다

+0

얼마나 많은 시간이 토네이도에서 계속 살아 있습니까? –

+0

이점은 이점이 실체 인 Server Sent 이벤트에 유용합니다. 클라이언트가 닫을 때 이벤트 소스에 다시 연결을 시도 할 필요가 없습니다. 따라서 SSE의 경우 tornado.web.asynchronous가 정상적으로 작동 할 수 있습니다. – Cris

관련 문제