Pythonはsocketに基づいてTCP/IPクライアントとサーバ通信を実現します。


前言
ソケットは、ネットワークアドレスなどの機能を分析するためのもの以外に、サーバを配置して、到来したメッセージを傍受することができる。
例えば、ネットワーク上でネットワークロボットとチャットして、ロボット(サーバ)にデータを送信して、ロボット(サーバ)からチャットデータ情報をフィードバックします。
もちろん、ロボットの返事の内容は機械学習にも関連しているかもしれませんが、簡単なフィードバックはソケットの知識です。
簡単なサーバーとクライアントの構築
ソケットの応用はもう分かりました。以下、簡単な一方向通信TCP/IPサーバとクライアントを実現する。
サーバ
サーバーの原理は以下の通りです。
  • は、まずソケットを作成し、TCPはストリームに向けたソケットである。SOCK_を使う必要がありますSTREAM
  • その後、bind()関数を使ってソケットをサーバのアドレスに関連付けます。(私たちは現地でテストしただけですので、直接に住所を127..0.1またはlocal hostに設定します。ポート番号は10000です。)もちろん、あなたの身の回りに2台のコンピュータ設備があれば、直接にローカルネットワークのIPアドレス
  • を置き換えることができます。
  • listen()関数を呼び出してソケットをサーバモードに設定し、無限ループ待ち、パラメータは最大待ち行列数
  • です。
  • は、ループで、accept()を呼び出し、クライアントのメッセージ接続を待つ。クライアントが接続されている場合、accept()関数は、オープンされた接続とクライアントアドレス
  • を返します。
  • は、recv関数が受信したデータ
  • を保存するためのバッファ領域を指定する。
  • は、sedall()を介してクライアントデータをフィードバックする
  • を実行する。
  • データを転送した後、現在のクライアントとの通信が完了しました。クローズド()を使ってクローズ掃除が必要です。
  • サンプルコードは以下の通りです。
    
    import socket
    
    # 1.       ,
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2.  bind()              
    sock.bind(('localhost', 10000))
    # 3.  listen()              
    sock.listen(1)
    
    while True:
        # 4.  accept()          
        #           ,  accept()                  
        connection, client_address = sock.accept()
        print("       :", client_address)
        try:
            # 5.       ,        recv        
            data = connection.recv(1024)
            print(data)
            if data:
                # 6.  sendall()         。
                connection.sendall("      ".encode())
            else:
                print("         ,       ")
        finally:
            #7.    close()      
            connection.close()
    
    クライアント
    クライアントを実現するのは、サーバよりも簡単です。モニターは必要ないので、データを接続して送信すればいいです。クライアントの実現は主に以下の通りである。
  • ソケットを作成します。
  • は、connect()関数を使用してサーバ
  • に接続されている。
  • .sedall()を介してサーバにデータを送信する
  • サーバを介して送還されたデータ
  • を受け取ります。
  • 相互作用が完了したら、クローズド()を使ってクリーンアップ
  • を行います。
    例は以下の通りです
    
    import socket
    
    # 1.       ,
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2.  bind()              
    sock.connect(('localhost', 10000))
    
    try:
        msg = b"Are you there?"
        # 3.  sendall()        
        sock.sendall(msg)
        # 4.  recv()           
        data = sock.recv(1024)
        print(data.decode())
    finally:
        # 5.      ,  close()    
        sock.close()
    
    実行後、サーバとクライアントの相互作用効果は以下の通りです。
    服务器数据
    客户端数据
    クリアードconnection(より簡単なクライアント)
    接続サーバはconnect()関数を使う以外に、実はもう一つの関数create(u)があります。connectionはサーバに接続するために、いくつかのステップを省略することができる。例は以下の通りです
    
    import socket
    
    #                
    def getConstants(prefix):
        return {
            getattr(socket, n): n
            for n in dir(socket)
            if n.startswith(prefix)
        }
        
    ipproto_str = getConstants("IPPROTO_")
    family_str = getConstants("AF_")
    type_str = getConstants("SOCK_")
    
    sock = socket.create_connection(('127.0.0.1', 10000))
    print(ipproto_str[sock.proto])
    print(family_str[sock.family])
    print(type_str[sock.type])
    
    try:
        msg = b"Are you there?"
        sock.sendall(msg)
        data = sock.recv(1024)
        print(data.decode())
    finally:
        sock.close()
    
    運転後の効果は以下の通りです。
    客户端
    クリアードconnection()関数の原理は、getaddrifo関数を用いて候補接続のパラメータを検索し、開いたsocketを返すことである。getaddrifo()関数の説明内容は前のsocketライブラリ(ジャンプをクリックして表示します)。
    ここでPythonについては、socketに基づいてTCP/IPクライアントとサーバ通信を実現する文章を紹介します。Python TCP/IPクライアントとサーバ通信の内容については、以前の記事を検索したり、下記の関連記事を閲覧したりしてください。これからもよろしくお願いします。