python-socketプログラミング

4939 ワード

クライアント/サーバアーキテクチャサーバは、一連のハードウェアまたはソフトウェアであり、1つ以上のクライアントに必要なサービスを提供します.クライアントの要求を待機し、応答し、より多くの要求を待つ唯一の目的があります.クライアント/サーバネットワークプログラミングは、サーバがクライアント要求に応答する前に、その後の作業の準備のためにいくつかの初歩的な設定プロセスを行う必要があります.まず、サーバがリクエストをリスニングできる通信エンドポイントが作成されます.サーバを会社のフロントとしたり、会社の主線の呼び出しに応答したりする合計の配線員として使用できます.電話番号とデバイスのインストールに成功し、配線員が到着すると、サービスが開始されます.クライアントは、単一の通信ポイントを作成し、サーバの接続を確立するだけで簡単です.クライアントは、必要なデータ交換を含む要求を発行することができます.要求がサーバによって処理され、クライアントが結果または確認情報を受信すると、今回の通信はソケットを終了します.通信エンドポイントソケットはコンピュータネットワークデータ構造であり、通信エンドポイントの概念を体現しています.任意のタイプの通信が開始される前に、ネットワークアプリケーションはソケットを作成する必要があります.電話ジャックにたとえることができ、中にあれば通信できない.ソケットタイプは、ファイルベース(プロセス間通信)とイメージネットワークに分けられます.ソケットアドレス:ホスト-ポートペアソケットが電話ジャックのような場合、通信を許可するいくつかのインフラストラクチャでは、ホスト名とポート番号は、ゾーン番号と電話番号の組み合わせのようなものです.ポート番号と住所が分からない限り、他の人が反対側で受信しなければならないことを事前に説明します.有効ポート番号範囲0~65535.POSIX対応システムを使用している場合は、/etc/servicesファイルに予約ポート番号のリストを見つけることができます.
接続向けソケットと接続なしソケット
どのアドレスファミリーを採用しても、2つの異なるスタイルのソケット接続があります.
接続向けソケット接続向けソケットは、通信を行う前に接続を確立しなければならないことを意味します.仮想回路またはストリームソケットとも呼ばれます.このような接続タイプを実現する主なプロトコルは転送制御プロトコル(TCP)であり、TCPソケットを作成するためにはSOCK_を使用する必要があるSTREAMはソケットタイプとしてTCPソケットの名前SOCK_STREAMは、ストリームソケットの1つの表現に基づいている.これらのソケットのネットワークバージョンは、インターネットプロトコル(IP)を使用してネットワーク内のホストを検索するため、システム全体が通常、この2つのプロトコル(TCPおよびIP)と組み合わせて行われる.TCPの利点:信頼性と安定性は、TCPがデータを転送する前に3回握手して接続を確立することに現れ、データ転送時に確認、ウィンドウ、再送、混雑制御メカニズムがあり、データ転送が終わった後、接続を切断してシステム資源を節約する.TCPの欠点:遅くて、効率が低くて、システムの資源を占有して高くて、攻撃されやすいです.TCPはデータを転送する前に接続を確立しなければならない.これは時間を消費し、データ転送時に確認メカニズム、再送メカニズム、混雑メカニズムに多くの時間を消費する.TCPには確認メカニズムがあり、携帯電話を3回握る方式があるため、TCPが利用されやすい.TCP三次握手プロセス1.ホストAはホストBに同期シーケンス番号を含むスカラービットのデータセグメントを送信することによって、ホストBに接続の確立を要求し、このデータセグメントホストAを通じてホストBに2つのことを教えます:私はあなたと通信したいです;どのシーケンス番号を開始データセグメントとして応答できますか.2.ホストBはホストAの要求を受け取った後、確認応答(ACK)と同期シーケンス番号(SYN)のフラグビットを持つデータセグメントでホストAに応答し、ホストAにも2つのことを伝えた:私はすでにあなたの要求を受け取って、あなたはデータを伝送することができます;どのシーケンス番号を開始データセグメントとして私に応答しますか.3.ホストAはこのデータセグメントを受け取った後、確認応答を送信し、ホストBのデータセグメントが受信されたことを確認します.「SYNというフラグビットは、TCPが接続されているときだけ1になります.握手が終わってから0になります.接続を切って接続を切るには、4回A:データの転送が終わりました.停止してもいいですか.B:メッセージは届きましたが、まだ準備ができていません.少々お待ちください.B:はい、A:はい、停止できます.メッセージがなければ、終了します.1ホストAがデータ転送を完了したら、停止します.その後、制御ビットFINを1にし、TCP接続の停止を要求する.2.ホストBはFINを受けて応答し、この方向のTCP接続がオフになることを確認し、ACKを1にセットする.3.B端があれば逆方向のクローズ要求を出し、FINを1にする.4.ホストAは、ホストBの要求を確認し、ACKを1にセットし、双方のクローズを終了する.
接続されていないソケット(UDP)
  • UDPは、データを転送する前にソースと端末が接続されていない非接続プロトコルであり、転送したい場合はアプリケーションからのデータを簡単にキャプチャし、できるだけ早くネットワークに捨てることができます.送信側では、UDPがデータを伝送する速度は、アプリケーションがデータを生成する速度、コンピュータの能力、伝送帯域幅に制限されるだけである.受信側では、UDPは各メッセージセグメントをキューに配置し、アプリケーションはキューから1つのメッセージを読み出すたびに.
  • 接続を確立する必要がないため、接続状態、送受信状態などを維持する必要がないため、1台のサービスマシンは同時に複数のクライアントのように同じメッセージを伝送することができる.
  • UDPパケットのヘッダは短く、8バイトしかなく、TCPの20バイトパケットに対する追加のオーバーヘッドは小さい.
  • スループットは、混雑アルゴリズムによって調整されず、アプリケーションソフトウェアがデータを生成するレート伝送帯域幅、ソース側、および端末ホストのパフォーマンスによってのみ制限される.
  • UDPは、信頼性の保証がないため、複雑なリンクステータステーブルを維持する必要がないという最善の努力を尽くして提供されます.
  • UDPはメッセージ向けであり、送信側のUDPはアプリケーションから渡されたメッセージにヘッダを追加してIP層に下向きに渡す.分割もマージもせず、これらのメッセージの境界を保持するため、アプリケーションは適切なメッセージサイズを選択する必要があります.

  • ソケットモジュール
    TCP通信サービス
    import socket
    from time import ctime
    
    HOST = '172.25.254.77'
    PORT = 9777
    
    # 1.       socket  
    serverSocket = socket.socket()
    # 2.     ip   ,        socket;
    serverSocket.bind((HOST, PORT))
    # 3.             
    serverSocket.listen()
    print("server is listening %d......." %(PORT))
    # 4.         ,         ;
    # serverSocket.accept   2  , address   ,     ip   ;
    clientSocket, address = serverSocket.accept()
    
    # 5.            ;
    
    data = clientSocket.recv(1024).decode('utf-8')
    print("         :", data)
    
    
    # 6.         
    clientSocket.send(b'hello client')
    
    # 7.   socket  ,       ;
    serverSocket.close()
    clientSocket.close()
    

    クライアント
    import socket
    
    HOST = '172.25.254.77'
    PORT = 9777
    # 1.
    clientSocket = socket.socket()
    
    # 2.       
    clientSocket.connect((HOST, PORT))
    
    # 3.    ,      
    #  server      
    clientSocket.send(b'hello server')
    #         (         )
    recvData = clientSocket.recv(1024).decode('utf-8')
    print("         :", recvData)
    # 4.   socket  :
    clientSocket.close()
    

    UDP通信サービス
    import socket
    
    
    # TCP: 9999
    # UDP:9999
    HOST = '172.25.254.77'
    PORT = 9999
    server = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
    #     :
    server.bind((HOST, PORT))
    
    #          
    print('      UDP  .....')
    
    while True:
        #         
        data, addr = server.recvfrom(1024)
        print("         :", data)
        print("    socket   :", addr)
    
        recv_data = input("server>>").encode()
        server.sendto(recv_data, addr)
    
    

    クライアント
    import socket
    
    client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    address = ('172.25.254.77', 9999)
    
    while True:
        msg = input('client>>')
        msg = msg.encode()
        client.sendto(msg, address)
        print("         :", client.recv(1024))