Google おじさんがUser Datagram Client と Serverを思いついた
ユーザー データグラム クライアントとサーバー
ユーザー データグラム プロトコル (UDP) は、TCP/IP とは異なる動作をします。TCP がストリーム指向のプロトコルであり、すべてのデータが正しい順序で送信されることを保証するのに対し、UDP はメッセージ指向のプロトコルです。UDP は長時間の接続を必要としないため、UDP ソケットの設定は少し簡単です。一方、UDP メッセージは 1 つのパケットに収まる必要があり (IPv4 の場合、65,535 バイトのパケットにはヘッダー情報も含まれるため、65,507 バイトしか保持できないことを意味します)、TCP の場合のように配信は保証されません。
エコーサーバー
接続自体がないため、サーバーは接続をリッスンして受け入れる必要はありません。bind() を使用してソケットをポートに関連付け、個々のメッセージを待つだけです。
import socket
import sys
# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# Bind the socket to the port
server_address = ('localhost', 10000)
print >>sys.stderr, 'starting up on %s port %s' % server_address
sock.bind(server_address)
メッセージは recvfrom() を使用してソケットから読み取られ、データと送信元のクライアントのアドレスが返されます。
while True:
print >>sys.stderr, '\nwaiting to receive message'
data, address = sock.recvfrom(4096)
print >>sys.stderr, 'received %s bytes from %s' % (len(data), address)
print >>sys.stderr, data
if data:
sent = sock.sendto(data, address)
print >>sys.stderr, 'sent %s bytes back to %s' % (sent, address)
エコークライアント
UDP エコー クライアントはサーバーに似ていますが、bind() を使用してソケットをアドレスにアタッチしません。sendto() を使用してメッセージをサーバーに直接配信し、recvfrom() を使用して応答を受信します。
import socket
import sys
# Create a UDP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_address = ('localhost', 10000)
message = 'This is the message. It will be repeated.'
try:
# Send data
print >>sys.stderr, 'sending "%s"' % message
sent = sock.sendto(message, server_address)
# Receive response
print >>sys.stderr, 'waiting to receive'
data, server = sock.recvfrom(4096)
print >>sys.stderr, 'received "%s"' % data
finally:
print >>sys.stderr, 'closing socket'
sock.close()
クライアントとサーバーを一緒に
サーバーを実行すると、以下が生成されます。
$ python ./socket_echo_server_dgram.py
starting up on localhost port 10000
waiting to receive message
received 42 bytes from ('127.0.0.1', 50139)
This is the message. It will be repeated.
sent 42 bytes back to ('127.0.0.1', 50139)
waiting to receive message
クライアント出力は次のとおりです。
$ python ./socket_echo_client_dgram.py
sending "This is the message. It will be repeated."
waiting to receive
received "This is the message. It will be repeated."
closing socket
$