# 18 `SocketServer` -- ネットワークサーバ構築のための フレームワーク

`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`クラス が起動した全てのスレッドが終了するまで実行し続けます。

サーバクラス群は使用するネットワークプロトコルに関わらず、同じ外部 メソッドおよび属性を持ちます: