Pythonの低レベルネットワークインターフェース(ソケット)
Pythonの標準ライブラリの「socket」モジュールは、サーバーとクライアントマシンがオペレーティングシステム上でソケットエンドポイントを使用して通信する方法を定義します。 'socket' APIには、コネクション型ネットワークプロトコルとコネクションレス型ネットワークプロトコルの両方の関数が含まれています。
ソケットは、双方向通信リンクのエンドポイントです。 IPアドレスとポート番号が特徴です。接続を開始するには、両端のソケットを適切に構成する必要があります。これにより、着信メッセージをリッスンし、クライアントサーバー環境で応答を送信できるようになります。
'socket'モジュールのsocket()関数は、ソケットオブジェクトを設定します。
import socket obj = socket.socket(family, type, protocol)
'family'引数は、デフォルトではAF_INETです。許容されるその他の値は、AF_INET6、AF_UNIX、AF_CAN、またはAF_RDSです。 'type'引数の値は、デフォルトでは'SOCK_STREAM'であり、コネクション型プロトコル(TCP)を示します。コネクションレス型プロトコル(UDP)の場合は、「SOCK_DGRAM」に設定します。 'protocol'引数は通常、デフォルトで0に設定されています。
サーバーとクライアントのソケットオブジェクトは、それぞれサーバーソケットとクライアントソケットと呼ばれます。ソケットオブジェクトは次のメソッドを実装します
bind() | このメソッドは、ソケットを指定されたIPアドレスとポート番号にバインドします。 |
listen() | このメソッドはサーバーを起動し、リッスンループを実行してクライアントからの接続要求を探します。 |
accept() | 接続要求がサーバーによってインターセプトされると、このメソッドはそれを受け入れ、クライアントソケットをそのアドレスで識別します。 |
典型的なサーバー側のコードは
import socket ss = socket.socket() ss.bind(('localhost',12345)) ss.listen() client, addr = ss.accept() print ("connection request from: " + str(addr))
ローカルマシンをサーバーとして使用して、クライアントと同じマシンからの着信メッセージをリッスンする場合、そのIPアドレスは「127.0.0.1」であり、ループバックアドレスとも呼ばれます。 'localhost'のホスト名で識別されます。ソケットは任意の空のポート番号でリッスンするように作られています。ネットワーク内の離れたマシン間の通信には、実際のIPアドレスを使用する必要があります。
クライアントソケットは、IPアドレスとポート番号をリッスンしているサーバーソケットに接続要求を送信します
connect()
obj = socket.socket() obj.connect((host,port))
クライアントからの接続要求がサーバーによって受け入れられると、両方のソケットオブジェクトがTCPプロトコルを使用して接続され、データを送受信できるようになります。
send()
サーバーは、傍受したアドレスを使用してデータをクライアントに送信します。
client.send(bytes)
クライアントソケットは、接続を確立したソケットにデータを送信します。
obj.send(bytes)
sendall()
send()に似ています。このメソッドは、いずれかのデータが送信されるまでデータを送信し続けます。
sendto()
この方法は、UDPプロトコルの場合にのみ使用されます。
recv()
このメソッドは、クライアントに送信されたデータを取得するために使用されます。サーバーの場合、リクエストが受け入れられたリモートソケットを使用します。
client.recv(bytes)
クライアントの場合、
obj.recv(bytes)
recvfrom()
この方法は、UDPプロトコルの場合に使用されます。
サーバーコード
import socket host = "127.0.0.1" port = 12345 ss = socket.socket() ss.bind((host,port)) ss.listen() cs, addr = server.accept() print ("Connection from: " + str(addr)) while True: data = cs.recv(1024).decode() if not data: break print ("from connected user: " + str(data)) print ("Received from User: " + str(data)) data = input("type message: ") conn.send(data.encode()) cs.close()
クライアントコード
import socket host = '127.0.0.1' port = 12345 obj = socket.socket() obj.connect((host,port)) message = input("type message: ") while message != 'q': obj.send(message.encode()) data = obj.recv(1024).decode() print ('Received from server: ' + data) message = input("type message: ") obj.close()
2つのコマンドプロンプトウィンドウを開きます。 1つでは、最初にサーバーコードを実行します。他の実行中のクライアントコード。
-
Pythonソケットエラー48を修正
ソケットエラー48は、プロセスがすでに使用されているポートに自分自身をバインドしようとしたときにトリガーされるPythonエラーです。 「socket.error:[Errno48]アドレスはすでに使用されています」エラーの原因は何ですか? 簡単な調査の結果、原因は次のとおりであることがわかりました。 ポートにバインドされたプロセス: サーバー上にプロセスが作成されるたびに、インターネットとの通信にポートが使用されます。ポートは、一度に1人のゲストを楽しませることができるホストのようなものです。ただし、ポートを指定しない場合、サーバーはデフォルトのポートでポートを作成するだけです。次回
-
Rubyネットワークプログラミング
Rubyでカスタムネットワーククライアントとサーバーを作成しますか?または、それがどのように機能するかを理解しますか? 次に、ソケットを処理する必要があります。 このルビーネットワークプログラミングのツアーに参加してください 基本を学び、Rubyを使用して他のサーバーやクライアントと会話を始めましょう! では、ソケットとは何ですか ? ソケットは通信チャネルのエンドポイントであり、クライアントとサーバーの両方がソケットを使用して通信します。 動作方法は非常にシンプルです : 接続が確立されると、データをソケットに入れることができます。データはもう一方の端に送られ、そこで受信者はソケ