1、基本的な考え方
1.1socketソケット
ソケットは、単に、通信処理は主に異なるホストとの間で、プロセス間通信として、TCP / IPプロトコルに基づいてネットワークアドレスとポートの組み合わせ、としてオペレーティングシステムへのシステムコールを理解することができます。ソケットので、その一般に、ネットワークプログラマと主要なオペレーティングシステムとの直接TCP / IPの契約は、一般的に、適切なAPI呼び出しを提供する必要はありません。例えば、ソケットの使用は、あなたが適切なネットワークIPとポート番号をバインドすることができ、あなたが使用したり、TCP、UDPを使用するように選択することができます。
1.2tcpとUDP
TCPプロトコルはIPプロトコルの上に構築されています。TCPプロトコルは、データパケットが到着することを保証するために、2台のコンピュータ間の確実な接続を確立する責任があります。TCP接続は、パッケージが失われた場合、他の当事者は、受信されることを保証するためには、それが自動的に再発行され、各IPパケットの番号のために、そして、ハンドシェイク合意を通じて確立されます。多くの一般的な高レベルプロトコルは、このようなブラウザ、送信SMTPプロトコルのHTTPプロトコルとしてTCPプロトコルに基づいて構築されています。
UDPプロトコルを使用する場合は、接続を確立せず、唯一のあなたは、直接データパケットを送信することができ、お互いのIPアドレスとポート番号を知っておく必要があります。しかし、私たちは到達できないかわかりません。信頼性の低いUDPトランスポートデータを使用していますが、それは以上の利点があり、TCPは、信頼性の高いデータが到着速く、必要としない、あなたはUDPプロトコルを使用することができます。
1.3クライアントとサーバー
あなたはTCP接続を作成すると、受動的応答サーバ接続と呼ばれる接続、クライアントが開始と呼ばれます。私たちは、あなたのブラウザーでシナを訪問したときたとえば、お使いのコンピュータは、私たちのクライアントである、ブラウザは、SANサーバへの接続を開始します。すべてがうまくいけば、シーナは、私たちのサーバー接続を受け入れ、TCP接続が確立され、通信がページのコンテンツを返送することです。
1.4回路図
簡単なチャットプログラムに基づいて2、HIパイソン
2.1サーバプログラム
インポートソケット SK = socket.socket() #デフォルトAF_INET、SOCK_STREAMの アドレス=(' 127.0.0.1 '、12345 ) (アドレス)sk.bind #のソケットにバインドホストポート番号 sk.listen(3)#セットとTCPリスナーの起動 を印刷する(「waitting ... 」) しながら、真は: CONN、ADDR = sk.accept() #のTCPコネクションの受動的な受け入れ、着信接続のために待機していたが、 印刷(「着信接続」、ADDR) しながら、真の: データ = conn.recv(1024) #TCPメッセージを受信し、最大の長さを設定 IF ない:データ を印刷する(' 切断!' ) はconn.close() BREAKの 印刷(STR(データ、' UTF8 ' )) のInP = INPUT('>> ' ) コネティカットを。送信(バイト(INP、「UTF8 」)) #の顧客に対するエンドループバック情報
TCPを使用して、TCPプロトコルは、SOCK_STREAMを表していることに注意してください
2.2クライアントプログラム
インポート ソケット SK = socket.socket() #デフォルトAF_INET、SOCK_STREAMの アドレス=(' 127.0.0.1 '、12345 ) sk.connect(アドレス)#の接続サーバ 間真: のInP(= INPUT '>> ' ) IFのInP == ' 出口' : BREAKの sk.send(バイト(INP、' UTF8 ')) #サーバに送信する情報 データ= sk.recv(1024 ) 印刷(STR(データ、' UTF8 ' )) 他: sk.close()
結果:
3、使用straceのは、プログラムコードのAPI呼び出しを追跡します
straceののpython3 server.py
結果: