Python chatroom 多人聊天室

本篇介紹如何使用 Python 來撰寫 chatroom 多人聊天室的程式,在上一篇介紹了怎麼撰寫一個基本的 TCP socket 通訊程式,本篇開始介紹如何使用先前幾篇學習到的 python tcp socket 基礎來打造一個多人聊天室,

在多人聊天室的通訊程式設計上,通常有多執行緒(muti-threading)與多路復用(select)的兩種設計方式,以下將會介紹,

server 多人聊天室伺服器端 (多執行緒版本)

使用多執行緒來寫多人聊天室伺服器端,每連上一個客戶端便開一個執行緒服務 clientthread() 這個客戶連線,

python-chatroom-server.py
1
2
3
4
5
6
7
8
9
10
11
while True:
conn, addr = server.accept()

list_of_clients.append(conn)

print(addr[0] + " connected")

threading.Thread(target = clientthread, args = (conn, addr))

conn.close()
server.close()

以下為 clientthread() 函式內容,簡單說就是將收到的訊息廣播給已連線的所有客戶端,
如果有人離線的話則處理離線的邏輯,

python-chatroom-server.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def clientthread(conn, addr):

# sends a message to the client whose user object is conn
conn.send("Welcome to this chatroom!".encode("utf-8"))

while True:
try:
message = conn.recv(2048)
if len(message) != 0:
print("<" + addr[0] + "> " + message.decode("utf-8"))

# Calls broadcast function to send message to all
message_to_send = "<" + addr[0] + "> " + message.decode("utf-8")
broadcast(message_to_send, conn)

else:
print('server closed connection.')
remove(conn)

except:
continue

client 多人聊天室客戶端 (select版本)

使用 select,不但能同時接收訊息外,也能接收到鍵盤的輸入訊息,並把鍵盤輸入的訊息傳輸出去,
這兩個一收一送的動作,透過多路復用 select() 函式可以達到同時運作的功效,

python-chatroom-client.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
while True:
read_sockets, write_socket, error_socket = select.select(sockets_list, [], [])

for socks in read_sockets:
if socks == server:
message = socks.recv(2048)
print(message.decode("utf-8"))
else:
message = sys.stdin.readline()
server.send(message.encode("utf-8"))
sys.stdout.write("<You>")
sys.stdout.write(message)
sys.stdout.flush()
server.close()

其它相關文章推薦
下一篇會介紹如何打造一個gui圖形介面的多人聊天室
Python TCP Socket Server/Client 網路通訊程式