Select Language

AI Technology Community

9.5、UDP echoサーバーの構築(Python実装)

「TCPエコーサーバの構築」と「簡単なTCPクライアントの作成」では、それぞれTCPプロトコルを使用してエコーサービスのサーバー側コードとクライアント側コードを作成する方法を紹介しました。このセクションでは、UDP版のエコーサービスを実装します。

TCPとUDPは大きく異なりますが、ソケットインターフェースの面ではそれほど大きな違いはありません。ただ、ソケットを作成する際にはソケットの異なるタイプを指定する必要があり、またデータを読み取る際には異なるインターフェースを使用する必要があります。

UDPでは、recvインターフェースを使用しない方が良いです。なぜなら、UDPは接続がないため、データがどこから来るかは不確定です。最初のデータがマシンAから来るかもしれないし、次のデータがマシンBから来るかもしれません。したがって、データの送信元が重要になります。recv()を使用すると送信元のアドレス情報を取得できませんが、recvfrom()を使用すると送信元のアドレス情報を取得できます。

データの送信にも同様の状況があります。TCPは接続があるため、データを送信すると自然に相手側に送られます。一方、UDPは接続がないため、送信する際に受信者を指定する必要があります。send()は受信者を指定しないため、受信者はbind()の際に指定されます。sendto()は受信者のパラメータがあるため、1つのソケットでマシンAにデータを送信し、次にマシンBにデータを送信することができます。これはTCPでは実現できない機能です。

TCP型のソケットは、特定の2台のマシン間でのみデータを送信できます。

もう1つの違いは、現在のサーバー側では、以前の接続が存在するかどうかで退出するかどうかを判断できないことです。したがって、サーバーが退出できるようにするために、quitコマンドを送信する必要があります。サーバーはquitコマンドを受信すると自動的に退出し、そうでない場合は常に待機し、受信したデータを返します。

以下はサーバー側のコードです:

import socket
HOST = ''
PORT = 50007
    # ソケットインスタンスオブジェクトを作成
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((HOST, PORT))                    # ローカルポート番号50007をバインド
while True:                                # データを繰り返し読み取る
    data, sender = s.recvfrom(1024)        # データを受信
    print('Got Data From', sender)                # 送信者の情報を表示
    s_data = data.decode("utf-8")                # デコード
    print("Recv [%s] from " % s_data, sender)    # データ内容を表示
    s.sendto(data, sender)                # 受信したデータを送信者に返す
    if s_data == "quit":                        # quitの場合は、退出
        print("Got quit message, Echo Server Quit")
        break
s.close()                                        # ソケットインターフェースを閉じる


以下はクライアント側のコードです。

書式設定してコピー
import socket
HOST = '127.0.0.1'                                # データをローカルに送信
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
data = 'Hello, world'                            # 送信したい文字列
b_data = data.encode("utf-8")                    # エンコード
s.sendto(b_data, (HOST,PORT))                    # データを送信
data, sender = s.recvfrom(1024)                # サーバーからの返信データを待つ
print('Received: ',  data, " From ", sender)    # データの送信者情報を表示
data = 'quit'                                    # quitを送信して、サーバーを退出させる
b_data = data.encode("utf-8")
s.sendto(b_data, (HOST,PORT))
s.close()                                        # ソケットを閉じて、リソースを節約する
post
  • 5

    item of content
初期には、コンピュータ同士は相互に接続されておらず、孤立していました。それらの間のデータ交換は主にフロッピーディスク(現在のUSBフラッシュドライブに相当)を通じて行われていました。その後、人々はネットワークを創造し、コンピュータ間で情報の交換が可能になりました。
初期のコンピュータネットワークも種類が豊富で、サポートされているプロトコルも多岐にわたっていました。時間の経過とともに、現在広く使用されているのはIPネットワークとなり、他のタイプのネットワークは次第に姿を消しました。現在、オフィス内のローカルエリアネットワークでもインターネットでも、基本的にはIPネットワークを使用しています。
この章では、Pythonのネットワークプログラミングに関する知識を読者に紹介します。具体的には、TCP/IPプロトコル、ソケットインターフェース、TCP/UDPクライアントおよびサーバーの構築方法などを含みます。