2011-08-16 2 views
1

,이 방법의 끝에이 같은 코드가하는 bind 방법이있다 self._handle_events, 바로 전화 하시겠습니까?토네이도 HTTP 서버의 바인드 방법

그러나 모든 클라이언트는 새로운 파일 설명자를 생성합니다. 맞습니까?

그래서 ioloop 모니터 클라이언트의 소켓은 sock.fileno()을 통해 연결 되나요? 난 그냥 소스에서 잠깐 살펴했다

답변

0

(HttpServer에의 바인드 방법은 한 번만 호출), 다음과 같이 작동하는 것 같다 :

토네이도가 소켓 자체를 모니터링하지 않습니다, 그것은 운영에이 작업을 전달

시스템, epoll (Linux) 또는 select을 사용하십시오. self.io_loop.add_handler을 호출하면 새 연결을 사용할 수있을 때만 콜백이 추가됩니다.

클라이언트 연결은 self._handle_events으로 설정되며 소켓으로 수신되는 각각의 새 연결에 대해 새 HTTPConnection이 생성됩니다. 각 HTTPConnection에서 사용하는 통신 소켓은 sock.accept()을 호출하여 만든 새 소켓입니다. 서버는 이전과 동일한 소켓에서 연결을 계속 허용합니다. 요약 그래서

: 새로운 연결이 소켓에 감지되면

  • 예, io_loop이 self._handle_events를 호출합니다.
  • 아니요, 소켓은 새 연결에 다시 사용됩니다. 대신 새로운 HTTPConnection 개체가 각 클라이언트에 대해 생성되며 통신을위한 별도의 소켓이 있습니다.
  • io_loop은 소켓을 적극적으로 모니터링 할 필요가 없습니다. epoll 또는 select을 사용하여 운영 체제로 전달합니다. 클라이언트와의 실제 통신은 HTTPConnection 개체에 의해 수행됩니다.

내가 이해해야 할 핵심 사항은 여기의 소켓이 새로운 연결을 수락하는 데 사용된다는 것입니다. sock.accept()을 사용하여 연결을 수락하면 통신을위한 새 소켓이 반환되고이 소켓은 HTTPConnection 개체에 연결됩니다.