第5回

マルチクライアントチャット

サーバプログラム

すべて開くすべて閉じる
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
-
|
|
!
 
 
 
 
 
 
-
!
-
!
-
!
 
-
|
!
 
 
 
-
!
-
!
 
-
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
!
 
 
#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()

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS