ソケットでデータを受信の方法
ソケットは2種類のメソッドでデータを受信します。
- ブロック型メソッド:データ受信にブロック型メソッドを用いると,データを受信するまで処理を待機します。一般的なブロック型メソッドを次に示します。
- recv():TCPソケットからデータを処理する方法で、データが受け取られるかエラーになるまでブロックされます。
- recvfrom():UDPソケットのデータを受け取るために使用します。データを受信するかエラーが発生するまで、同様にブロックします。
- たとえば,Pythonでは、阻塞モードでデータを受信すると、
- import socket
# TCP ソケットを作成する
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# IP アドレスとポート番号にバインドする
server_socket.bind((‘127.0.0.1’, 8080))# 待ち受け状態にする
server_socket.listen()# クライアントとの接続を受け付ける
(client_socket, addr) = server_socket.accept()# データを受信する(ブロック方式)
data = client_socket.recv(1024)# 受信したデータを処理する
print(data.decode())# ソケットを閉じる
client_socket.close()
server_socket.close() - 非同期メソッド: データ受信を非同期メソッドで行うと、データが受信されたかどうかに関係なく、すぐに返ります。一般的に使用される非同期メソッドは次のとおりです。
- ソケットを非ブロックモードに設定します。
- recv():TCPソケットのデータの受信に用いる。非ブロッキングモードでは、データ受信がないことを示すエラー(EWOULDBLOCKなど)を即座に返す。データ受信の有無は例外処理を用いて判断する必要がある。
- recvfrom():UDPソケットからのデータ受信に用いる。非ブロックモードでも、直ちにエラーかデータが返される。
- たとえば、Pythonでは、非ブロックでデータを受信します:
- import socket
# TCPソケットの作成
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# ソケットを非ブロッキングモードに設定
server_socket.setblocking(False)# IPとポート番号をバインド
server_socket.bind((‘127.0.0.1’, 8080))# 関連付けを待ち受け
server_socket.listen()try:
while True:
# 接続の受付
client_socket, addr = server_socket.accept()# クライアントソケットを非ブロッキングモードに設定
client_socket.setblocking(False)# データの受信(非ブロッキングメソッド)
try:
data = client_socket.recv(1024)
if data:
# 受信データの処理
print(data.decode())
except socket.error as e:
if e.errno == errno.EWOULDBLOCK:
# データを受信していない場合
pass
else:
# その他のエラー
raise# ソケットのクローズ
client_socket.close()except KeyboardInterrupt:
# Ctrl + C 割り込みシグナルをキャッチし、ソケットをクローズ
server_socket.close()
なお、記載のコードは一例であり、実際の利用の際には、状況に応じて適宜修正・追記が必要になります。