ホームページ  >  記事  >  バックエンド開発  >  Python の SocketServer フレームワークを使用してネットワーク サービス プログラムを作成する

Python の SocketServer フレームワークを使用してネットワーク サービス プログラムを作成する

高洛峰
高洛峰オリジナル
2016-10-19 16:08:031237ブラウズ

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()#开启服务


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。