Python ソケットプログラミング – サーバー、クライアントの例

こんにちは、学習者の皆さん!前回のチュートリアルでは、Python unittestモジュールについて話しました。今日はPythonソケットプログラミングの例を見てみましょう。

Pythonソケットプログラミング

Pythonソケットプログラミングを理解するには、ソケットサーバーソケットクライアント、およびソケットについて知っておく必要があります。では、サーバーとは何でしょうか?サーバーはクライアントのリクエストを待ち、それに応じて処理またはサービスを提供するソフトウェアです。一方で、クライアントはこのサービスの要求者です。クライアントプログラムはサーバーに対してリソースを要求し、サーバーはそのリクエストに応じて応答します。ソケットは、サーバーとクライアントの間の双方向通信チャネルのエンドポイントです。ソケットはプロセス内で通信したり、同じマシン上のプロセス間で通信したり、異なるマシン上のプロセス間で通信したりします。リモートプログラムとの通信では、ソケットポートを介して接続する必要があります。このソケットプログラミングのチュートリアルの主な目的は、ソケットサーバーとクライアントが互いにどのように通信するかを紹介することです。また、Pythonソケットサーバープログラムの書き方も学びます。

Pythonソケットの例

以前に述べたように、ソケットクライアントはソケットサーバーに対していくつかのリソースを要求し、サーバーはその要求に応答します。したがって、両方のモデルを設計し、それぞれがそれらと通信できるようにします。手順は次のように考えることができます。

  1. Pythonソケットサーバープログラムは最初に実行され、要求を待機します。
  2. Pythonソケットクライアントプログラムは最初に会話を開始します。
  3. その後、サーバープログラムはクライアントの要求に応じて応答します。
  4. クライアントプログラムはユーザーが「バイ」とメッセージを入力すると終了します。クライアントプログラムが終了するとサーバープログラムも終了しますが、これは任意であり、サーバープログラムを無期限に実行したり、クライアントの要求で特定のコマンドで終了したりすることができます。

Pythonソケットサーバー

私たちはPythonソケットサーバープログラムをsocket_server.pyとして保存します。Pythonソケット接続を使用するには、socketモジュールをインポートする必要があります。その後、順番にサーバーとクライアントの間で接続を確立するためにいくつかのタスクを実行する必要があります。ホストアドレスはsocket.gethostname()関数を使用して取得できます。ポートアドレスは1024以上を使用することが推奨されています。なぜなら、1024未満のポート番号は標準のインターネットプロトコルに予約されているためです。以下はPythonソケットサーバーの例コードです。コメントがコードを理解するのに役立ちます。

import socket


def server_program():
    #ホスト名を取得する
    host = socket.gethostname()
    port = 5000  # initiate port no above 1024

    server_socket = socket.socket()  # get instance
    #注意深く見てください。bind()関数は引数としてタプルを受け取ります
    server_socket.bind((host, port))  # bind host address and port together

    #サーバーが同時にリッスンできるクライアントの数を設定する
    server_socket.listen(2)
    conn, address = server_socket.accept()  # accept new connection
    print("Connection from: " + str(address))
    while True:
        #データストリームを受信します。1024バイトを超えるデータパケットは受け入れません
        data = conn.recv(1024).decode()
        if not data:
            #データが受信されない場合は中断
            break
        print("from connected user: " + str(data))
        data = input(' -> ')
        conn.send(data.encode())  # send data to the client

    conn.close()  # close the connection


if __name__ == '__main__':
    server_program()

したので、私たちのPythonソケットサーバーはポート5000で実行され、クライアントのリクエストを待機します。サーバーをクライアントの接続が切断されたときに終了させないようにするには、if条件とbreakステートメントを削除してください。Pythonのwhileループはサーバープログラムを無期限に実行し、クライアントのリクエストを待ち続けます。

Pythonソケットクライアント

プログラムを socket_client.py として保存します。このプログラムは、サーバープログラムと類似していますが、バインディングを除いています。サーバープログラムとクライアントプログラムの主な違いは、サーバープログラムではホストアドレスとポートアドレスを結合する必要がある点です。以下はPythonソケットクライアントの例コードです。コメントがコードの理解を助けます。

import socket


def client_program():
    host = socket.gethostname()  # as both code is running on same pc
    port = 5000  # socket server port number

    client_socket = socket.socket()  # instantiate
    client_socket.connect((host, port))  # connect to the server

    message = input(" -> ")  # take input

    while message.lower().strip() != 'bye':
        client_socket.send(message.encode())  # send message
        data = client_socket.recv(1024).decode()  # receive response

        print('Received from server: ' + data)  # show in terminal

        message = input(" -> ")  # again take input

    client_socket.close()  # close the connection


if __name__ == '__main__':
    client_program()

Pythonソケットプログラミングの出力

出力を見るには、まずソケットサーバープログラムを実行します。次に、ソケットクライアントプログラムを実行します。その後、クライアントプログラムから何かを書きます。その後、再びサーバープログラムからの返信を書きます。最後に、両方のプログラムを終了するためにクライアントプログラムからbyeと書きます。以下の短いビデオは、私がソケットサーバーとクライアントの例プログラムのテストランでどのように動作したかを示します。

pankaj$ python3.6 socket_server.py 
Connection from: ('127.0.0.1', 57822)
from connected user: Hi
 -> Hello
from connected user: How are you?
 -> Good
from connected user: Awesome!
 -> Ok then, bye!
pankaj$
pankaj$ python3.6 socket_client.py 
 -> Hi
Received from server: Hello
 -> How are you?
Received from server: Good
 -> Awesome!
Received from server: Ok then, bye!
 -> Bye
pankaj$

ソケットサーバーがポート5000で実行されていますが、クライアントもサーバーに接続するためにソケットポートが必要です。このポートは、クライアント接続呼び出しによってランダムに割り当てられます。この場合、57822です。これでPythonソケットプログラミング、Pythonソケットサーバー、およびソケットクライアントの例プログラムについてのすべてです。参照:公式ドキュメント

Source:
https://www.digitalocean.com/community/tutorials/python-socket-programming-server-client