30.4. エンタープライズ開発ステップ2.4:サービス・エンドの迅速な開発

5289 ワード

前述の内容では,TCPプログラミングとUDPプログラミングによるネットワークデータの通信と共有について述べた.
クライアントプログラムの作成は比較的容易であり,主にサービス側に接続してサービス側とデータインタラクションを行う必要があることが分かる.しかし,サービス側のプログラム作成は複雑であり,データの同時処理など様々な問題を考慮すると,より複雑で操作しにくい.
pythonは、必要なサービス・エンド環境をより迅速に構築するためのsocketserverモジュールを提供します.
本節の内容
  • socketserverモジュール概要
  • 通常モードサービス側プログラミング
  • 同時モードサービス側プログラミング
  • 1.socketserverモジュールの概要
  • socketserverとは何ですか?socketserverモジュールのpythonが提供する内蔵のサービスエンドプログラムを迅速に開発するためのサーバフレームワークは、大量の実装をカプセル化することで開発者の作業量を削減し、より高品質のサービスエンドプログラムを迅速に開発することができます.
  • socketserverでは何が提供されていますか?socketserverモジュールが主に含むサーバクラス:TCPserver、UCPserver、ThreadingTCPserver、ThreadingUDPserver、ForkingTCPserver、ForkingUDPserver注意:上記TCPはTCPサービス側プログラミングに必要なサービスクラスを表し、UDPはUDPプログラミングに必要なサービスクラスを表し、Threadingのマルチスレッド同時需要を表すサービスクラスを含む.Forkingを含むマルチプロセスの同時性を示すサービスクラスマルチスレッドとマルチプロセスについては、後述する
  • について詳しく説明します.
  • socketserverコア操作?SOcketserverフレームワークでは、サービス側の処理クラスは、主にStreamRequestHandler(TCPプロトコルベース)、DatagramRequestHandler(UDPプロトコルベース)、処理クラスにおいて非常に重要な方法headler()がサービス側プログラムにおけるコアオペレーション
  • を実行するために使用される.
    class mytcpserver(socketserver.StreamRequestHandler):
        def handle(self):
            #            
    
  • socketserverの構造?socketserverには主に2つの部分が含まれています.サーバと処理クラスサービスクラスはsocketserverがTCPserver、UDPserverなどの処理クラスを内蔵しています.処理クラスにはhandle()メソッドが含まれています.ビジネス処理
  • に使用されます.
    2.サービス側プログラミング
    2.1. TCPサービス側プログラミング
    SOcketserverを使用してサービス・エンド・プログラムを作成するには、次のようにします.
    import socketserver
    
    
    #       
    class myTcp(socketserver.StreamRequestHandler):
        #       
        def handle(self):
            #   client_address            
            print("       :%s" % str(self.client_address))
            while True:
                #           
                msg = self.request.recv(1024)
                if not msg:
                    break;
                print("        :%s" % msg.decode("UTF-8"))
                #           
                self.request.sendall("            ".encode("UTF-8"))
    
    
    #           
    if __name__ == "__main__":
        #        ,     ,   8888  
        server = socketserver.TCPServer(('', 8888), myTcp)
        #        
        server.serve_forever()
    

    この場合、通常のモードを使用してクライアントプログラムを開発するには、次のようにします.
    import socket
    
    sc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    sc.connect(("192.168.10.108", 8888))
    
    while True:
        msg = input("         :")
        if not msg or msg == "exit":
            break
        sc.sendall(msg.encode("UTF-8"))
        msg = sc.recv(1024)
        print("     :" + msg.decode("UTF-8"))
    
    sc.close()
    

    上記のプログラムを実行すると、以前と同様に、クライアントとサービス間のデータ通信を実現することができる.以前とは異なる場合、クライアントを閉じると、サービス側プログラムが実行され、クライアントを再起動すると、クライアントはサービス側にアクセスし、接続と通信を再確立します.
    2.2. UDPサービス側プログラミング
    SOcketserverのUDPServerサービスクラスとDatagramRequestHandler処理クラスを使用したサービス側のプログラミング処理は以下の通りです.
    import socketserver
    
    #         
    class myUdp(socketserver.DatagramRequestHandler):
        #          
        def handle(self):
            #             
            print("         :" + str(self.client_address))
    
            #     
            while True:
                #           
                # msg = self.request.recv()
                msg = self.rfile.readline()
                if not msg:
                    break
                print("           :%s" % msg.decode("UTF-8"))
                #     
                self.wfile.write("         ".encode("UTF-8"))
    #           
    if __name__ == "__main__":
        #   UDP     
        server = socketserver.UDPServer(("", 8989), myUdp)
        #   UDP   
        server.serve_forever()
    

    UDPクライアントコードを通常の方法で開発するには、次のようにします.
    import socket
    
    sc = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    
    while True:
        data = input("         :")
        if not data or data == "exit":
            break
    
        sc.sendto(data.encode("UTF-8"), ("192.168.10.108", 8989))
    
        data,recv = sc.recvfrom(1024)
        if not data:
            break
        print("       :" + data.decode("UTF-8"))
    
    sc.close()
    

    このときサービス側プログラムを起動し,クライアントプログラムを起動すれば,サービス側とクライアント時間のデータ通信を実現できる.また、複数のクライアントプログラムを起動してみてください.彩卵がありますよ.
    3.サービス側同時
    マルチスレッドまたはマルチプロセス同時化の使用方法についても簡単ですが、リファレンスコードは以下の通りです.興味があれば、同時プログラミングを学習した後、ThreadingTCPServerやForkingTCPServerのようなマルチスレッドとマルチプロセス同時化の操作を振り返ってみてください.サービス側リファレンスコード:
    import socketserver
    
    class myTcp(socketserver.StreamRequestHandler):
        def handle(self):
            while True:
                data = self.request.recv(1024)
                print("     :" + data.decode("UTF-8"))
                self.request.sendall("        ".encode("UTF-8"))
    
    if __name__ == "__main__":
        server = socketserver.ThreadingTCPServer(("", 9000), myTcp)
        server.serve_forever()
    

    クライアントか通常のクライアントか
    import socket
    
    sc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    sc.connect(("192.168.10.108", 9000))
    
    while True:
        msg = input("         :")
        if not msg or msg == "exit":
            break
        sc.sendall(msg.encode("UTF-8"))
        msg = sc.recv(1024)
        print("     :" + msg.decode("UTF-8"))
    
    sc.close()
    

    大牧莫邪png