1. 前書き:
単純なネットワーク プログラムを Python で作成するのは便利ですが、より複雑なネットワーク プログラムには既製のフレームワークを使用する方が良いでしょう。これにより、ソケットのさまざまな詳細ではなく、トランザクション ロジックに集中できるようになります。 SocketServer モジュールは、ネットワーク サービス プログラムを作成するタスクを簡素化します。同時に、SocketServer モジュールは、Python 標準ライブラリの多くのサーバー フレームワークの基礎でもあります。
2. ネットワーク サービス クラス:
SocketServer は、TCP ソケット ストリーム用の
TCPServer
UDP データグラム ソケット用の
UNIX ドメイン ソケット用の UnixStreamServer および UnixDatagramServer の 4 つの基本サービス クラスを提供します。
それらの継承関係は次のとおりです:
+----------------+
|BaseServer |
+--------------- ---+
|
v
+-----------+ +-------+
| ------->| UnixStreamServer |
+-----------+ +------+
|
v
+---- -------+ +---------+
|------ ->| UnixDatagramServer |
+- ----------+ +----------------------+
2.1 非同期処理:
これら 4 つのサービス クラスはすべて、リクエストされて同期的に処理されます。 1 つのリクエストが処理されるまで、次のリクエストを処理できません。非同期モデルをサポートするには、多重継承を使用して、サーバー クラスが ForkingMixIn または ThreadingMixIn ミックスイン クラスを継承できるようにします。
ForkingMixIn はマルチプロセス (フォーク) を利用して非同期実装を実現します。
ThreadingMixIn はマルチスレッドを使用して非同期を実現します。
3. リクエスト処理クラス:
サービスを実装するには、ハンドラー クラスのリクエスト処理クラスを派生し、親クラスの handle() メソッドをオーバーライドする必要もあります。 handle メソッドは、リクエストを処理するために特に使用されます。このモジュールは、サービス クラスと要求処理クラスの組み合わせを通じて要求を処理します。
SocketServer モジュールによって提供されるリクエスト処理クラスには、BaseRequestHandler とその派生クラス StreamRequestHandler および DatagramRequestHandler が含まれます。名前からわかるように、1 つはストリーミング ソケットを処理でき、もう 1 つはデータグラム ソケットを処理できます。
4. SocketServer を使用してサービスを作成する手順を要約します。
1. リクエスト ハンドラー クラス (リクエスト処理クラス) を作成し、BaseRequestHandler クラスから継承し、リクエストを処理する handle() メソッドをオーバーライドします。
2. サーバー クラス オブジェクトをインスタンス化し、サービスのアドレスと以前に作成したリクエスト ハンドラー クラスを渡します。
3. サーバー クラス オブジェクトの handle_request() メソッドまたはserve_forever() メソッドを呼び出して、リクエストの処理を開始します。
SocketServer に基づくサーバーの例:
from SocketServer import TCPServer,StreamRequestHandler #定义请求处理类 class Handler(StreamRequestHandler): def handle(self): addr = self.request.getpeername() print 'Got connection from ',addr self.wfile.write('Thank you for connecting') server = TCPServer(('',1234), handler)#实例化服务类对象 server.server_forever()#开启服务
5. 非同期で実装し、複数の接続をサポートします
前にサービス クラスを紹介したときに述べたように、4 つの基本サービス クラスはデフォルトで同期モデルです。非同期をサポートするには、多重継承を使用して ForkingMixIn または ThreadingMixInmix-in クラスと基本サービス クラスを継承し、非同期をサポートするサービス クラスを定義できます。例:
class Server(ThreadingMixIn, TCPServer): pass
ForkingMixIn プロセス間通信を考慮する必要があります。 ThreadingMixIn は、スレッドが同じ変数にアクセスする場合、同期と相互排他を考慮する必要があります。
マルチスレッドを使用したサーバーの例:
from SocketServer import TCPServer, ThreadingMixIn, StreamRequestHandler #定义支持多线程的服务类,注意是多继承 class Server(ThreadingMixIn, TCPServer): pass #定义请求处理类 class Handler(StreamRequestHandler): def handle(self): addr = self.request.getpeername() print 'Got connection from ',addr self.wfile.write('Thank you for connection') server = Server(('', 1234), Handler)#实例化服务类 server.serve_forever()#开启服务