Python の `recvfrom` 関数の使用方法を教えてください。
Pythonでは、recvfromメソッドはソケットからデータを最大受信バイト数で指定して受信します。一般的な構文は次のとおりです。
data, address = socket.recvfrom(buffer_size)
socketはソケットオブジェクト、buffer_sizeは受信する最大バイト数。recvfrom関数は指定されたバイト数を受信するまで、または接続が切断されるまで、プログラムの実行をブロックします。
dataは受信したデータでバイト配列です。addressはデータを送信してきたリモートホストのアドレスとポート番号の組(tuple)です。
以下に簡単な例を示します。
import socket
# 创建UDP套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定地址和端口号
server_address = ('localhost', 12345)
sock.bind(server_address)
# 接收数据
data, address = sock.recvfrom(4096)
print('Received', data, 'from', address)
# 关闭套接字
sock.close()
上記の例では、まずUDPソケットを作成し、ローカルのアドレスとポート番号にbindします。次にrecvfrom関数を使用してデータを受信します。最大受信バイト数は4096です。最後に、受信したデータと送信者のアドレスを出力します。
ただし、recvfrom関数が返すデータはバイト配列なので、文字列に変換したい場合はdecodeメソッドを使うとよいでしょう。例えばdata.decode(‘utf-8’)のようにします。
加えて、recvfrom関数はtimeoutパラメータを設定することでタイムアウトを設定可能で、この関数でプログラムがブロックされ続けることを回避できます。例:
sock.settimeout(5) # 设置超时时间为5秒
data, address = sock.recvfrom(4096)
そのため、5秒以内にデータを受信しなかった場合には、recvfrom関数はsocket.timeout例外をスローします。