ex05_01.py
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[第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
終了行:
[[第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
ページ名: