2

SocketServer モジュールを使用して、サーバーのリクエスト ハンドラー内の個々の接続にタイムアウトを追加したいと考えています。

まず、Python を使用してネットワーク プログラミングを試みるのはこれが初めてです。SocketServer.BaseRequestHandler と SocketServer.ThreadingTCPServer と SocketServer.TCPServer をサブクラス化し、いくつかの基本的なスレッド TCP 機能を備えた 2 つのクラスを作成することができました。

ただし、着信接続をタイムアウトにしたいと思います。組み込みの SocketServer タイムアウト値とメソッドのいずれかをオーバーライドしようとしても機能しません。ドキュメントによると、これはフォーク サーバーでのみ機能するためです。X 秒後に起動するタイマー スレッドを作成することができましたが、ハンドラー スレッド内のブロッキング recv 呼び出しの性質により、強制的に強制終了されるため、これは役に立ちません。避けたい。

したがって、通知を受け取り、一定量のデータを読み取る非同期コアの実装が必要であることを理解しています。5 秒間データが送信されない場合、その接続を閉じたいとします (きれいに行う方法を知っています)。ソケットで非同期コアを使用する例をいくつか見つけましたが、SocketServer を使用した例はありません。では、どうすれば asyncore & threadingTCPserver を実装できますか? 出来ますか?誰かがやったことがありますか?

4

1 に答える 1

3

recv次のように、通話にタイムアウトを設定することもできます。

sock.settimeout(1.0)

を使用しているため、 のどこかでSocketServer基になるものを見つける必要があります。によってソケットが作成されるため、自分で行う必要はありません。socketSocketServerSocketServer

RequestHandlerおそらく、と一緒に を定義しているでしょうSocketServer。次のようになります。

class RequestHandler(SocketServer.BaseRequestHandler):
    def setup(self):
         # the socket is called request in the request handler
         self.request.settimeout(1.0)

    def handle(self):
         while True:
             try: 
                 data = self.request.recv(1024)
                 if not data:
                      break # connection is closed
                 else:
                      pass  # do your thing
             except socket.timeout:
                 pass # handle timeout
于 2012-09-20T10:21:07.000 に答える