0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[python]echo serverをマルチクライエントに対応しましょう

Last updated at Posted at 2021-04-23

概要

前回pythonで簡単な echo サーバーを作りましょう は、pythonで簡単なechoサーバーを作成しました。
が、そのサーバーは一つのクライエントしかに対応できないので、
今回はpythonの_threadモジュールを使って、マルチクライエントに対応しよう!

変更点

  • サーバー
  1. クライエント受送信部分はonNewClientに封じました
  2. クライエントごとにスリードを配ります。
  • クライエント

    サーバーとの接続が成功でしたら、まず一回受信してみる(Welcomeメッセージがあるから)。

サーバーサイド

まずサーバーサイドを見てみよう

pythonには_threadthreadingとの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()
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?