#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

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS