#author("2023-01-20T08:49:24+09:00","default:parallel-distributed","parallel-distributed") #author("2023-01-23T23:10:47+09:00","default:parallel-distributed","parallel-distributed") [[第5回]] **マルチクライアントチャット [#v8a502fc] *** サーバプログラム [#t9dfeba1] #code(Python){{ #ex05_01.py # -*- coding: utf-8 -*- # import socket import threading HOST = '' PORT = 9998 clxa=[] #複数のclientのsocketとアドレスの組を格納するリスト def start_server(): print("start server socket") #socket.socket()...接続先のsocketを作成 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #sock.binde ...socket をこのホスト('')のIPアドレスとPortに結合 sock.bind((HOST, PORT)) #sock.listen(10)...clientからの接続を待つ。10は最大の接続要求可能数 sock.listen(10) while True: #sock.accept()...client から接続があると、クライアントと接続する #socket conと接続元IP address を返す con,address = sock.accept() clx=(con,address) #clxに tuple (con, address)を代入 clxa.append(clx) #clxaにclxを追加 print("[connect]{}".format(address)) #clientと送受信するためのthread, handler を生成。 handle_thread = threading.Thread(target=handler, args=(clx,clxa,)) #生成した handle_threadの実行開始(start) handle_thread.start() #client からsocketを通じてstreamの入力を行うthreadのhandler def handler(clx,clxa): print("at server, connected, start handler"); con=clx[0] #clx[0] は con(socket), address=clx[1] #clx[1] は address while True: try: data = con.recv(1024) #socket con から最大1024byte 受信 print("[receive]{} - {}".format(address, data.decode("utf-8"))) except socket.error: #socketにエラーが発生したとき con.close() #socketをclose try: clxa.remove(clx) #clxaから、閉じたsocketとIPアドレスのペアを削除 except: print("no entry when closing") break for cx in clxa: if cx!=clx: #他のclientのsocket を通じて、受信したデータを送信 try: cx[0].send(data) except: print("failed to "+cx[1]) if __name__ == "__main__": host = socket.gethostname() # ipアドレスを取得、表示 ip = socket.gethostbyname(host) print(ip) # 192.168.○○○.○○○ start_server() }} ---- #counter