Socket の本来の英語の意味は「穴」または「ソケット」です。 BSD UNIX のプロセス通信メカニズムとして、一般に「ソケット」とも呼ばれます。これは、IP アドレスとポートを記述するために使用され、通信チェーンのハンドルであり、異なる仮想マシンまたは異なるコンピューター間の通信を実装するために使用できます。 。
ネットワーク上の 2 つのプログラムは、双方向通信接続を通じてデータを交換します。この接続の一端はソケットと呼ばれます。
ネットワーク通信接続を確立するには、少なくともペアのポート番号 (ソケット) が必要です。ソケットは本質的には TCP/IP をカプセル化するプログラミング インターフェイス (API) であり、TCP/IP はプログラマーがネットワーク開発に使用するインターフェイスも提供します。これは、ソケット プログラミング インターフェイスであり、カプセル化または表示する手段を提供します。データ。ソケットはネットワーク通信機能を提供します。
Pythonのソケットについて話しましょう。
ソケットを作成するにはsocket.socket()関数を使用します。構文は次のとおりです:
socket.socket(socket_family,socket_type,protocol=0)
socket_family には次のパラメータを指定できます:
socket.AF_INET IPv4 (デフォルト)
socket.AF_INET6
sock et.AF_UNIX では、単一の Unix システムのプロセス間通信にのみ使用されます
socket_type は次のパラメータになります:
socket.SOCK_STREAM ストリーミングソケット、TCP 用 (デフォルト)
socket.SOCK_DGRAM データグラムソケット、UDP 用
socket.SOCK_RAW Raw ソケット通常のソケットは ICMP や IGMP などのネットワーク メッセージを処理できませんが、SOCK_RAW は処理できます。次に、SOCK_RAW は特殊な IPv4 メッセージも処理できます。さらに、生のソケットを使用すると、ユーザーが IP_HDRINCL ソケット オプションの IP ヘッダーを介してメッセージを構築できます。
socket.SOCK_RDM は UDP の信頼できる形式であり、データグラムの配信を保証しますが、順序は保証しません。 SOCK_RAM は、元のプロトコルへの低レベルのアクセスを提供するために使用され、ICMP メッセージの送信など、特定の特殊な操作を実行する必要がある場合に使用されます。 SOCK_RAM は通常、パワー ユーザーまたは管理者によって実行されるプログラムに制限されます。
socket.SOCK_SEQPACKET 信頼性の高い連続パケットサービス
プロトコルパラメータ:
0 (デフォルト) 0の場合、システムはアドレス形式とソケットカテゴリに基づいて自動的に選択します。プロトコル
サーバー側のソケット関数
s.bind() アドレス(IPアドレス、ポート)をソケットにバインド、パラメータはタプル形式である必要があります 例: s.bind (('127.0.0.1',8009))
s.listen(5) リッスンを開始します。5 は保留中の接続の最大数です
s.accept() クライアント接続を受動的に受け入れ、ブロックし、接続を待機します
Clientソケット関数
s.connect() サーバーに接続します。パラメータはタプル形式である必要があります。例: s.connect(('127,0.0.1',8009))
公共目的のソケット関数
s .recv(1024) TCP データを受信します。1024 は 1 回のデータ受信のサイズです
s.send(bytes) TCP データを送信します。Python3 の送信データの形式はバイト形式である必要があります
s.sendall( ) データを送信します内部ループはsend
s.close()を呼び出してソケットをクローズします 例1. ソケットプログラムの簡単な実装サーバー側#!/usr/bin/env python # _*_ coding:utf-8 _*_ import socket import time IP_PORT = ('127.0.0.1',8009) BUF_SIZE = 1024 tcp_server = socket.socket() tcp_server.bind(IP_PORT) tcp_server.listen(5) while True: print("waiting for connection...") conn,addr = tcp_server.accept() print("...connected from:",addr) while True: data = tcp_server.recv(BUF_SIZE) if not data:break tcp_server.send('[%s] %s'%(time.ctime(),data)) tcp_server.close()
最初の行はUnixの起動情報行で、その後にtimeモジュールとsocketモジュールがインポートされます5~10行IP_PORTはグローバル変数のIPアドレスとポートを宣言しており、bind()関数がこのアドレスとバッファーにバインドされます。サイズは 1K に設定され、listen() 関数は、同時に受信できる接続の最大数を示します 11~ 最後の行まで サーバーのループに入ったら、接続が到着するまで受動的に待ちます。接続がある場合は、会話ループに入り、クライアントがデータを送信するのを待ちます。メッセージが空の場合は、クライアントが終了したことを意味し、ループから抜け出して次の接続の到着を待ちます。クライアント メッセージを取得したら、メッセージの前にタイムスタンプを追加して戻ります。ループが終了せず、サーバーが close() を実行しないため、最後の行は実行されません。 close() 関数を呼び出すことを忘れないように注意してください。 クライアント側
#!/usr/bin/env python # _*_ coding:utf-8 _*_ import socket HOST = '127.0.0.1' PORT = 8009 BUF_SIZE = 1024 ADDR = (HOST,PORT) client = socket.socket() client.connect(ADDR) while True: data = input(">>> ") if not data:break client.send(bytes(data,encoding='utf-8')) recv_data = client.recv(BUF_SIZE) if not recv_data:break print(recv_data.decode()) client.close()
[root@pythontab]# python client.py >>> hello python [Thu Sep 15 22:29:12 2016] b'hello python'
[root@pythontab]# python server.py waiting for connection... ...connected from: ('127.0.0.1', 55378)
服务端程序代码
#!/usr/bin/env python # _*_ coding:utf-8 _*_ import socketserver import time HOST = '127.0.0.1' PORT = 8009 ADDR = (HOST,PORT) BUF_SIZE = 1024 class Myserver(socketserver.BaseRequestHandler): def handle(self): while True: print("...connected from:",self.client_address) data = self.request.recv(BUF_SIZE) if not data:break self.request.send(bytes("%s %s"%(time.ctime(),data))) server = socketserver.ThreadingTCPServer(ADDR,Myserver) print("waiting for connection...") server.serve_forever()
11~17行
主要的工作在这里。从socketserver的BaseRequestHandler类中派生出一个子类,并重写handle()函数。
在有客户端发进来的消息的时候,handle()函数就会被调用。
19~21行
代码的最后一部分用给定的IP地址和端口加上自定义处理请求的类(Myserver)。然后进入等待客户端请求与处理客户端请求的无限循环中。
客户端程序代码
import socket HOST = '127.0.0.1' PORT = 8009 ADDR = (HOST,PORT) BUF_SIZE = 1024 client = socket.socket() client.connect(ADDR) while True: data = input(">>> ") if not data:continue client.send(bytes(data,encoding='utf-8')) recv_data = client.recv(BUF_SIZE) if not recv_data:break print(recv_data.decode()) client.close()
执行服务端和客户端代码
下面是客户端输出
[root@pythontab]# python socketclient.py >>> hello python Thu Sep 15 23:53:31 2016 b'hello python' >>> hello pythontab Thu Sep 15 23:53:49 2016 b'hello pythontab'
下面是服务端输出
[root@pythontab]# python socketserver.py waiting for connection... ...connected from: ('127.0.0.1', 55385) ...connected from: ('127.0.0.1', 55385) ...connected from: ('127.0.0.1', 55385) ...connected from: ('127.0.0.1', 55385)
以上がPythonのソケットモジュールの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。