ソケットでデータを受信の方法

ソケットは2種類のメソッドでデータを受信します。

  1. ブロック型メソッド:データ受信にブロック型メソッドを用いると,データを受信するまで処理を待機します。一般的なブロック型メソッドを次に示します。
  2. recv():TCPソケットからデータを処理する方法で、データが受け取られるかエラーになるまでブロックされます。
  3. recvfrom():UDPソケットのデータを受け取るために使用します。データを受信するかエラーが発生するまで、同様にブロックします。
  4. たとえば,Pythonでは、阻塞モードでデータを受信すると、
  5. 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()

  6. 非同期メソッド: データ受信を非同期メソッドで行うと、データが受信されたかどうかに関係なく、すぐに返ります。一般的に使用される非同期メソッドは次のとおりです。
  7. ソケットを非ブロックモードに設定します。
  8. recv():TCPソケットのデータの受信に用いる。非ブロッキングモードでは、データ受信がないことを示すエラー(EWOULDBLOCKなど)を即座に返す。データ受信の有無は例外処理を用いて判断する必要がある。
  9. recvfrom():UDPソケットからのデータ受信に用いる。非ブロックモードでも、直ちにエラーかデータが返される。
  10. たとえば、Pythonでは、非ブロックでデータを受信します:
  11. 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()

なお、記載のコードは一例であり、実際の利用の際には、状況に応じて適宜修正・追記が必要になります。

bannerAds