ソケットを理解する
ソケットは一般に「ソケット」とも呼ばれ、IP アドレスとポートを記述するために使用されます。これは、通常、アプリケーションが「ソケット」を通じてネットワークにリクエストを送信したり、ネットワークリクエストに応答したりするために使用されます。
Socket は Unix に由来しており、Unix/Linux の基本理念の 1 つは「すべてはファイルである」です。 ファイルの場合は、[開く] [読み書き] [閉じる] モードを使用して操作します。ソケットは、このモードの実装です。ソケットは、そのファイルに対する操作 (読み取り/書き込み IO、オープン、クローズ) です:
ファイル モジュールは [開く] [読み取り] です。指定したファイルを [開く] [読み書きする] [閉じる]
ython (バージョン 3.5 )最も単純なソケット通信を実現します#!/usr/bin/env python # coding=utf-8 # Author:Majh import socket ip_port = ('127.0.0.1', 9999) sk = socket.socket() sk.connect(ip_port) send_data = input('>>').strip() sk.send(bytes(send_data, encoding='utf-8')) recv_data = sk.recv(1024) print(str(recv_data, encoding='utf-8')) sk.close() 客户端代码
#!/usr/bin/env python # coding=utf-8 # Author:Majh import socket sk = socket.socket() ip_port = ('127.0.0.1', 9999) sk.bind(ip_port) print('sk.bind......') sk.listen(5) print('sk.listen......') conn, addr = sk.accept() print('conn:', conn) print('addr:', addr) read_data = conn.recv(1024) print('read_data', read_data) read_data = read_data.upper() conn.send(read_data) conn.close() 服务器端代码
sk =ソケット.socket(socket.AF_INET,socket.SOCK_STREAM,0)
パラメータ1:アドレスクラスタ
socket.AF_INET IPv4 (デフォルト)
socket.AF_INET6 IPv6 socket.AF_UNIXは、単一のUnixシステムのプロセス間通信にのみ使用できます
パラメータ2: Type
socket.SOCK_STREAM ストリーミングソケット、TCP用(デフォルト)
socket.SOCK_DGRAM データグラムソケット、UDP用ソケット.SOCK_RAW 生のソケット。通常のソケットは ICMP や IGMP などのネットワーク メッセージを処理できませんが、SOCK_RAW は特殊な IPv4 メッセージも処理できます。さらに、ユーザーは生のソケット ワードを使用して IP ヘッダーを構築できます。 IP_HDRINCL ソケット オプション。 Socket.SOCK_RDM は UDP の信頼できる形式であり、データグラムの配信を保証しますが、順序は保証しません。 SOCK_RAM は、元のプロトコルへの低レベルのアクセスを提供するために使用され、ICMP メッセージの送信など、特定の特殊な操作を実行する必要がある場合に使用されます。通常、SOCK_RAM はパワー ユーザーまたは管理者によって実行されるプログラムに制限されます。
Socket.SOCK_SEQPACKET 信頼性の高い連続パケットサービス
パラメータ3: Protocol
0(デフォルト) 特定のアドレスファミリーに関連するプロトコルは、アドレス形式とソケットカテゴリAに基づいてシステムが自動的に選択します。適切なプロトコル
sk.bind(address)
s.bind(address)はソケットをアドレスにバインドします。アドレスの形式はアドレス ファミリによって異なります。 AF_INET では、アドレスはタプル (ホスト、ポート) の形式で表現されます。
sk.listen(backlog)
着信接続のリスニングを開始します。バックログは、接続が拒否されるまでに保留状態にできる接続の最大数を指定します。
バックログは 5 に等しく、カーネルが接続リクエストを受信したが、サーバーがまだ処理のために accept を呼び出していないことを示します。接続の最大数は 5 です。カーネル内で接続キューを維持する必要があるため、この値を無限にすることはできません。
sk.setblocking( bool)
ブロックするかどうか(デフォルトはTrue)、Falseに設定した場合、acceptとrecv中にデータがない場合にエラーが報告されます。
sk.sendall(string[,flag])
文字列内のデータを接続されたソケットに送信しますが、戻る前にすべてのデータを送信しようとします。成功した場合は None を返し、失敗した場合は例外をスローします。
内部的には、すべてのコンテンツは send を再帰的に呼び出すことによって送信されます。
sk.sendto(string[,flag],address)
ソケットにデータを送信します。アドレスは(ipaddr, port)の形式のタプルで、リモートアドレスを指定します。戻り値は送信されたバイト数です。この機能は主に UDP プロトコルで使用されます。
sk.settimeout(timeout)
ソケット操作のタイムアウト期間を秒単位の浮動小数点数で設定します。値「なし」は、タイムアウト期間がないことを意味します。一般に、タイムアウト期間は接続操作 (最大 5 秒待機するクライアント接続など) に使用される可能性があるため、ソケットが最初に作成されるときに設定する必要があります
sk.getpeername()
接続されたソケットのリモート アドレスを返します。戻り値は通常、タプル (ipaddr、port) です。
sk.getsockname()
ソケット自身のアドレスを返します。通常はタプル (ipaddr,port) です