1、說明網絡
本文主要使用socket.socket發送UDP廣播來實現聊天室功能。多線程
重點難點:理解UDP通信流程、多線程、UDP廣播收發等。併發
測試環境:Win10\Python3.5。app
程序基本流程:建立接收端socket ---> 建立發送到socket ---> 啓動接收端socket ---> 啓動發送端socket ---> 等待用戶輸入 ---> 接收用戶輸入併發送到廣播 ---> 接收信息並顯示。socket
2、程序運行圖工具
如圖所示,啓動了兩個客戶端(端口號分別爲6064九、60652)以及啓動一個網絡測試工具(測試工具只發),客戶端1發送hello,客戶端2能夠接收到此廣播並顯示。測試
3、源碼編碼
1 # -*- coding:utf-8 -*- 2 3 from socket import * 4 from time import ctime, sleep 5 import threading 6 7 8 class ChatRoomPlus: 9 def __init__(self): 10 # 全局參數配置 11 self.encoding = "utf-8" # 使用的編碼方式 12 self.broadcastPort = 7788 # 廣播端口 13 14 # 建立廣播接收器 15 self.recvSocket = socket(AF_INET, SOCK_DGRAM) 16 self.recvSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) 17 self.recvSocket.setsockopt(SOL_SOCKET, SO_BROADCAST, 1) 18 self.recvSocket.bind(('', self.broadcastPort)) 19 20 # 建立廣播發送器 21 self.sendSocket = socket(AF_INET, SOCK_DGRAM) 22 self.sendSocket.setsockopt(SOL_SOCKET, SO_BROADCAST, 1) 23 24 # 其餘 25 self.threads = [] 26 27 def send(self): 28 """發送廣播""" 29 30 print("UDP發送器啓動成功...") 31 self.sendSocket.sendto("***加入了聊天室".encode(self.encoding), ('255.255.255.255', self.broadcastPort)) 32 while True: 33 sendData = input("請輸入須要發送的消息:") 34 35 self.sendSocket.sendto(sendData.encode(self.encoding), ('255.255.255.255', self.broadcastPort)) 36 # print("【%s】%s:%s" % (ctime(), "我", sendData)) 37 38 sleep(1) 39 40 def recv(self): 41 """接收廣播""" 42 43 print("UDP接收器啓動成功...") 44 while True: 45 # 接收數據格式:(data, (ip, port)) 46 recvData = self.recvSocket.recvfrom(1024) 47 48 print("【%s】[%s : %s] : %s" % (ctime(), recvData[1][0], recvData[1][1], recvData[0].decode(self.encoding))) 49 50 sleep(1) 51 52 def start(self): 53 """啓動線程""" 54 55 t1 = threading.Thread(target=self.recv) 56 t2 = threading.Thread(target=self.send) 57 self.threads.append(t1) 58 self.threads.append(t2) 59 60 for t in self.threads: 61 t.setDaemon(True) 62 t.start() 63 64 while True: 65 pass 66 67 68 if __name__ == "__main__": 69 demo = ChatRoomPlus() 70 demo.start()