本篇介紹如何使用 Python 來撰寫 chatroom 多人聊天室的程式,在上一篇介紹了怎麼撰寫一個基本的 TCP socket 通訊程式,本篇開始介紹如何使用先前幾篇學習到的 python tcp socket 基礎來打造一個多人聊天室,
在多人聊天室的通訊程式設計上,通常有多執行緒(muti-threading)與多路復用(select)的兩種設計方式,以下將會介紹,
server 多人聊天室伺服器端 (多執行緒版本)
使用多執行緒來寫多人聊天室伺服器端,每連上一個客戶端便開一個執行緒服務 clientthread()
這個客戶連線,
1 | while True: |
以下為 clientthread()
函式內容,簡單說就是將收到的訊息廣播給已連線的所有客戶端,
如果有人離線的話則處理離線的邏輯,1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21def 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() 函式可以達到同時運作的功效,1
2
3
4
5
6
7
8
9
10
11
12
13
14while 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 網路通訊程式