2011-08-16 4 views
1

は、bindメソッドは、このメソッドの最後に、そこにある。このようなコードです:トルネードhttpserver.pyのHTTPサーバのbindメソッド

sock.bind(sockaddr) 
sock.listen(128) 
self._sockets[sock.fileno()] = sock 
if self._started: 
self.io_loop.add_handler(sock.fileno(), self._handle_events, 
         ioloop.IOLoop.READ) 

ソケットが接続されているとき、それは意味し、ioloop.IOLoop.READイベントをトリガし、電話self._handle_events、右?

しかし、すべてのクライアントは新しいファイルディスクリプタを生成します。

したがって、ioloopモニタクライアントのソケットはsock.fileno()経由で接続しますか? (HttpServerをのbindメソッドが一度だけ呼ばれる)

答えて

0

は、私はちょうどソースで簡単に見ていた、そしてこのように動作するようです:トルネードソケット自体を監視しません

、それが動作にこの仕事を渡しますシステム、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オブジェクトに接続されます。

関連する問題