概要
前回pythonで簡単な echo サーバーを作りましょう は、pythonで簡単なechoサーバーを作成しました。
が、そのサーバーは一つのクライエントしかに対応できないので、
今回はpythonの_thread
モジュールを使って、マルチクライエントに対応しよう!
変更点
- サーバー
- クライエント受送信部分は
onNewClient
に封じました - クライエントごとにスリードを配ります。
-
クライエント
サーバーとの接続が成功でしたら、まず一回受信してみる(Welcomeメッセージがあるから)。
サーバーサイド
まずサーバーサイドを見てみよう
pythonには_thread
とthreading
との2つのスレットを処理するモジュールがありますが、
今回は抽象度の低い_thread
を使わせていただきます。
import _thread
'''
略
'''
while True:
client_socket,client_address = server_socket.accept()
client_socket.send(("Welcome to the server").encode())
print("[-] Connection from",client_address)
#スレッドを起動する
_thread.start_new_thread(onNewClient,(client_socket,client_address))
クライエント
略
結果
まずサーバを実行してみよう:
PS > python .\echo_server_multi.py
[-] Socket Bound to port 45621
[-] Listening...
クライエント1号さんを実行する:
PS > python .\echo_client.py
[-] Received from server: Welcome to the server
>I'm No.1
[-] Received from server: I'm No.1
>
クライエント2号さんを実行する:
PS > python .\echo_client.py
[-] Received from server: Welcome to the server
>I'm No.2
[-] Received from server: I'm No.2
>
サーバーの方の表示:
[-] Connection from ('127.0.0.1', 13425)
[-] Connection from ('127.0.0.1', 13426)
[-] Send by client(('127.0.0.1', 13425)):I'm No.1
[-] Send by client(('127.0.0.1', 13426)):I'm No.2
全コード
#server
import socket
import _thread
HOST = '127.0.0.1'
PORT = 45621
def onNewClient(client_socket:socket.socket,addr):
while True:
data = client_socket.recv(1024)
if not data : break
str_data = data.decode()
print("[-] Send by client({0}):{1}".format(addr,str_data))
client_socket.send(data)
client_socket.close()
server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_socket.bind((HOST,PORT))
print("[-] Socket Bound to port " + str(PORT))
server_socket.listen(5)
print("[-] Listening...")
while True:
client_socket,client_address = server_socket.accept()
client_socket.send(("Welcome to the server").encode())
print("[-] Connection from",client_address)
_thread.start_new_thread(onNewClient,(client_socket,client_address))
#client
import socket
client_socket = socket.socket()
client_socket.connect(("127.0.0.1",45621))
while True:
newData = client_socket.recv(1024)
print("[-] Received from server:" ,str(newData.decode()))
data = input(">")
client_socket.send(data.encode())
if not data:break
client_socket.close()