【Python】socket通信プログラム サーバーの起動状態の継続

前回作成したプログラムは、複数のメッセージをクライアントがサーバーから受け取るようなものでした。ただし、サーバーが一つのクライアントにメッセージを送信すると、サーバーが停止してしまうという問題点がありました。今回はその問題点を解消したサーバープログラムを作ってみたいと思います。

実際に試した環境

  • Python 3.6.2
  • Windows 10

作成するプログラム

  • サーバー(server.py):”Hello”、”Welcome to doingsite.net”、”Bye”、”Bye!”という4つのメッセージをクライアントに送信する。メッセージを送信しても停止はしない。
  • クライアント(client.py):サーバーからのメッセージをすべて受信し、停止する。
    ※クライアントは前回から変更ありません。

作成したプログラム

サーバー(server.py)

import socket

HOST = '127.0.0.2'
PORT = 65432

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen()
while True:
    conn, addr = s.accept()
    print('Connected by ', addr)
    conn.sendall(b'Hello')
    conn.sendall(b'Welcome to doingsite.net')
    conn.sendall(b'Bye')
    conn.sendall(b'Bye!')
    conn.close()
s.close()

クライアント(client.py)

import socket

HOST = '127.0.0.2'
PORT = 65432

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
while True:
    rcv_msg = s.recv(1024)
    if not rcv_msg:
        break
    print(rcv_msg)
s.close()

実行結果

※サーバーのプログラムを実行後は、Ctrl+cなどで停止できません。Windowsの場合はタスクマネージャーを使って、プロセスの中にある該当プログラム名”Python”を停止させてください。

画面1(サーバー側)

> python .\server.py
Connected by  ('127.0.0.1', 65147)
Connected by  ('127.0.0.1', 65148)
Connected by  ('127.0.0.1', 65149)

画面2 (クライアント側)

> python .\client.py
b'Hello'
b'Welcome to doingsite.netByeBye!'
>
> python .\client.py
b'Hello'
b'Welcome to doingsite.netByeBye!'
>
> python .\client.py
b'Hello'
b'Welcome to doingsite.netByeBye!'
>

解説

サーバープログラムに関して前回と大きく異なる点は、while文で下記処理をしているところです。

① ループの最初でクライアントからの接続を待ちます。

conn, addr = s.accept()

② クライアントが接続しにきたら、誰が接続しに来たかを表示します。

print('Connected by ', addr)

③ メッセージを送信します。

conn.sendall(b'********')

④ ループの最後でaccept()で得たソケットオブジェクトのconnを close() で閉じます。

conn.close()

より詳しくsocketの内容について知りたい方は、このURLをご参照ください。

まとめ

このように何回クライアントプログラムがサーバーにアクセスしても、サーバーは停止しないようにすることができました。ちょっとしたサーバーらしくなってきましたね。
ただこのままだと、サーバーを停止するには、Windowsであればタスクマネージャーでプロセスを停止しなければなりません。また、実はクライアントの同時接続ができないといった問題点もあります。次回は、これらの問題点を解決するプログラムを作成したいと思います。

以上です。
最後までこの記事をご覧いただきありがとうございました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です