SocketServer モジュールはネットワークサーバを実装するタスクを 単純化します。
このモジュールには 4 つのサーバクラスがあります: TCPServer は、クライアントとサーバ間に継続的なデータ流路を提供 する、インターネット TCP プロトコルを使います。 UDPServer は、順序通りに到着しなかったり、転送中に喪失して しまってもかまわない情報の断続的なパケットである、データグラムを使います。 UnixStreamServer および UnixDatagramServer クラスも 同様ですが、Unix ドメインソケットを使います; 従って非 Unix プラットフォームでは利用できません。ネットワークプログラミングに ついての詳細は、W. Richard Steven 著 UNIX Network Programming や、 Ralph Davis 著 Win32 Network Programming のような 書籍を参照してください。
これらの 4 つのクラスは要求を 同期的に (synchronously) 処理します; 各要求は次の要求を開始する前に完結していなければなりません。 同期的な処理は、サーバで大量の計算を必要とする、あるいはクライアントが 処理するには時間がかかりすぎるような大量のデータを返す、といった理由に よってリクエストに長い時間がかかる状況には向いていません。 こうした状況の解決方法は別のプロセスを生成するか、個々の要求を 扱うスレッドを生成することです; ForkingMixIn および ThreadingMixIn 配合クラス (mix-in classes) を使えば、非同期的な動作をサポートできます。
サーバの作成にはいくつかのステップがあります。最初に、 BaseRequestHandler クラスをサブクラス化して 要求処理クラス (request hander class) を生成し、その handle() メソッドを上書きしなければなりません; このメソッドで入力される 要求を処理します。次に、サーバクラスのうち一つをインスタンス化して、 サーバのアドレスと要求処理クラスを渡さなければなりません。最後に、 サーバオブジェクトの handle_request() または serve_forever() メソッドを呼び出して、単一または多数の 要求を処理します。
ThreadingMixIn から継承してスレッドを利用した接続を行う場合、 突発的な通信切断時の処理を明示的に指定する必要があります。 ThreadingMixIn クラスには daemon_threads 属性があり、 サーバがスレッドの終了を待ち合わせるかどうかを指定する事ができます。 スレッドが独自の処理を行う場合は、このフラグを明示的に指定します。 デフォルトはFalseで、PythonはThreadingMixInクラス が起動した全てのスレッドが終了するまで実行し続けます。
サーバクラス群は使用するネットワークプロトコルに関わらず、同じ外部 メソッドおよび属性を持ちます:
) |
) |
) |
('127.0.0.1', 80)
の
ようにアドレスを与える文字列と整数のポート番号を含むタプルです。
サーバクラスは以下のクラス変数をサポートします:
TCPServer のような基底クラスのサブクラスで上書きできる サーバメソッドは多数あります; これらのメソッドはサーバオブジェクトの 外部のユーザにとっては役にたたないものです。
) |
) |
request, client_address) |
request, client_address) |
) |
) |
request, client_address) |
要求処理クラスでは、新たな handle() メソッドを定義 しなくてはならず、また以下のメソッドのいずれかを上書きすることができます。 各要求ごとに新たなインスタンスが生成されます。
) |
) |
self.request の型はサービスがデータグラム型かストリーム型かで 異なります。ストリーム型では、self.request はソケットオブジェクト です; データグラムサービスでは、self.request は文字列になります。 しかし、この違いは要求処理配合クラスのStreamRequestHandler や DatagramRequestHandlerを使うことで隠蔽することができます。 これらのクラスでは setup() および finish() メソッド を上書きしており、self.rfile および self.wfile 属性を 提供しています。 self.rfile および self.wfile は、要求データを取得したり クライアントにデータを返すために、それぞれ読み出し、書き込みを行うことが できます。
) |