pythonベースのsocketとsocketserver



---導入
Socketの英語の原義は「穴」または「コンセント」であり、Unixのプロセス通信メカニズムでは「ソケット」とも呼ばれている.ソケットは実際には複雑ではありません.ipアドレスとポート番号で構成されています.Socketは英語の原意のように多孔質のコンセントのようです.1台のホストは各種のコンセント(ipアドレス)がいっぱいある部屋のようで、各コンセントには多くのコンセント(ポート)があり、これらのコンセントを通じて電線(プロセス)に接続することができます.私たちは水を沸かしたり、テレビを見たり、パソコンを游んだりすることができます.
アプリケーションは、通常、ソケットを使用してネットワークにリクエストを送信するか、ネットワークリクエストに応答します.
ソケットの役割の1つは、異なるアプリケーションプロセスを区別することであり、あるプロセスが自機ipのポートをバインドすると、このipアドレスに転送されたこのポートに転送されたすべてのデータがカーネルによってプロセスに送られて処理される.
---pythonのsocket
Pythonは2つの基本的なsocketモジュールを提供しています.
1つ目はSocketで、標準的なBSD Sockets APIを提供しています.
2つ目はSocketServerで、サーバセンタークラスを提供し、ネットワークサーバの開発を簡素化します.
----socket
まず最初に言います.
現在のアプリケーションの多くはC/Sアーキテクチャ、すなわちクライアント/サーバ側に分かれていることが知られています.
サーバ側:サーバ側プロセスはソケットを申請し、自分でこのソケットにバインドし、このソケットを傍受する必要があります.クライアントがデータを送信すると、データを受け取って処理を行い、処理が完了するとクライアントに応答する.
クライアント:クライアントは比較的簡単で、クライアントは1つのソケットを申請するだけで、このソケットを通じてサーバー側のソケットに接続し、接続が確立されたら後続の操作を行うことができます.
pythonサーバ側を記述するには:
1ソケットの作成
=

2バインドソケット
s1.bind( address ) 
# AF_INET       ,address            ,   (host,port)。host    ,port     。
# 、 ,bind socket.error 。
# : ('192.168.1.1',9999)

3リスニングソケット
s1.listen( backlog ) 
#backlog                 。      1。       ,        ,     ,     。

4接続待ち
connection, address = s1.accept()#  accept   ,socket   “waiting”  ,         。       ,            。#accept               (connection,address)。
#     connection         socket  (            ),              ;
#      address    Internet  。

5処理フェーズ
connection.recv(bufsize[,flag])
# connection
# 。 ,bufsize 。flag , connection.send(string[,flag])# string 。 , string 。 : 。

6転送終了、接続を閉じる
s1.close()#     

pythonクライアントの作成
1 socketオブジェクトの作成
import socket
s2=socket.socket()

2サーバ側への接続
s2.connect(address)#   address     。  ,address      (hostname,port),      ,  socket.error  。

3処理段階
s2.recv(bufsize[,flag])#        。          ,bufsize           。flag           ,      s2.send(string[,flag])# string             。            ,       string     。 :            。

4接続終了、ソケットを閉じる
s2.close()

ソケットには多くの方法があります.
 
socket.getaddrinfo(host, port, family=0, type=0, proto=0, flags=0) 10061=0, count=

 
 
はい、socketを紹介しました.今からsocketserverを紹介します.
----socketserver
Pythonで簡単なネットワークプログラムを作成するのは便利ですが、複雑なネットワークプログラムは既製のフレームワークがいいです.これにより、ソケットのさまざまな詳細ではなく、トランザクションロジックに専念できます.SocketServerモジュールは、ネットワーク・サービス・プログラムの作成をシンプル化します.同時にSocketServerモジュールもPython標準ライブラリの多くのサーバフレームワークの基礎である.
socketserverはpython 2でSocketServer、python 3では頭文字の大文字をキャンセルしsocketserverと改名した.
socketserverには、サービスクラス(server class)、リクエスト処理クラス(request handle class)の2種類が含まれています.前者は、バインド、リスニング、実行......(つまり、接続を確立するプロセス)のような多くの方法を提供し、後者は、ユーザーが送信したデータ(つまり、トランザクションロジック)をどのように処理するかに集中します.
一般的に、すべてのサービスは、まず接続を確立し、すなわちサービスクラスのインスタンスを確立し、その後、ユーザ要求の処理を開始し、すなわち要求処理クラスのインスタンスを確立する.
 
ソースコードを分析し、サービスクラスがリクエスト処理クラスとどのように関連しているかを見てみましょう.
 == = =

     ===

 
次にこの2つのクラスを紹介します
まずサービスクラスを見てみましょう.
5種類:BaseServer、TCPServer、UnixStreamServer、UDPServer、UnixDatagramServer.
BaseServerは直接対外サービスしません.
TCPServerはTCPソケットストリームに対して
UDPServerはUDPデータに対してソケットを報告する
UnixStreamServerとUnixDatagramServerは、UNIXドメインソケット用にはあまり使用されません.
彼らの間の継承関係:
 
 
サービスクラスのメソッド:
 View Code
このいくつかのサービスクラスは、リクエストを同期的に処理します.1つのリクエストが処理されていないと、次のリクエストを処理できません.非同期モデルをサポートするには、マルチ継承を使用してserverクラスにForkingMixInまたはThreadingMixIn mix-in classesを継承させることができます.
ForkingMixInはマルチプロセス(分岐)を利用して非同期を実現する.
ThreadingMixInはマルチスレッドを用いて非同期を実現する.
 
要求プロセッサクラス:
サービスを実装するには、handler classリクエスト処理クラスを派生させ、親クラスのhandle()メソッドを書き換える必要があります.handleメソッドは、リクエストを処理するために使用されます.このモジュールは、サービスクラスとリクエスト処理クラスの組合せによってリクエストを処理する.
SocketServerモジュールが提供するリクエスト処理クラスには、BaseRequestHandlerとその派生クラスStreamRequestHandlerとDatagramRequestHandlerがあります.名前からフロー・ソケットを処理し、データ・レポート・ソケットを処理することがわかります.
 
要求処理クラスには、次の3つの方法があります.setup ()
  • Called before the  handle()  method to perform any initialization actions required. The default implementation does nothing.すなわちhandle()の前に呼び出され,主な役割は処理要求を実行する前の初期化に関連する様々な作業である.デフォルトでは何もしません.(何かをさせたい場合は、プログラマが自分のリクエストプロセッサでこの方法を上書きし(一般的にカスタマイズされたリクエストプロセッサはpythonで提供されているBaseRequestHandler,ps:後述する)
  • handle ()
  • This function must do all the work required to service a request. The default implementation does nothing. Several instance attributes are available to it; the request is available as  self.request ; the client address as  self.client_address ; and the server instance as  self.server , in case it needs access to per-server information.The type of  self.request  is different for datagram or stream services. For stream services, self.request  is a socket object; for datagram services,  self.request  is a pair of string and socket.handle()の仕事は,処理要求に関連するすべての仕事をすることである.黙認しても何もしない.彼にはいくつかの例のパラメータがある:self.request    self.client_address   self.server
  • finish ()
  • Called after the  handle()  method to perform any clean-up actions required. The default implementation does nothing. If  setup()  raises an exception, this function will not be called.handle()メソッドの後に呼び出されます.彼の役割は、リクエストを処理した後のクリーンアップ作業を実行することであり、デフォルトでは何もしません.
    Handlerソース
    ソースコードから、BaseRequestHandlerのsetup()/handle()/finish()は何も定義されていませんが、彼の2つの派生クラスStreamRequestHandlerとDatagramRequestHandlerはsetup()/finish()を書き換えています.
    したがって、socketserverプログラムを自分で作成する必要がある場合は、StreamRequestHandlerとDatagramRequestHandlerのうちの1つを親として適切に選択し、リクエスト処理クラスをカスタマイズし、handle()メソッドを書き換えるだけです.
     
    SOcketserverでサービスを作成するには:
    1 request handler class(リクエスト処理クラス)を作成し、StreamRequestHandlerとDatagramRequestHandlerのうちの1つを親として適切に選択し(もちろん、BaseRequestHandlerを親として使用してもよい)、handle()メソッドを書き直します.
    2 server classオブジェクトをインスタンス化し、サービスのアドレスと以前に作成したrequest handler classを渡します.
    3 server classオブジェクトを呼び出すhandle_request()またはserve_forever()メソッドは、リクエストの処理を開始します.