socket+threading实现python多人局域网聊天室
生活随笔
收集整理的這篇文章主要介紹了
socket+threading实现python多人局域网聊天室
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
socket+threading實現python多人局域網聊天室
服務端
import socket import threading""" 設計思路: 1.每連接一個客戶,創建一個線程 2.每個線程單獨接收一個客戶的信息,并向所有連接的客戶發送接受到的信息 3.這樣就可以實現聊天室的功能 """# 設置服務端 server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 本機IP地址 IP = '************' # 設置端口號 port = 12345 # 綁定主機名和端口 server.bind((IP,port)) server.listen(1000)# 用來記錄聊天室內的客戶 # 使用集合,確保集合里的元素唯一 customers = set()# 向所有用戶發送信息 def send_all(data,address):global customerstry:for customer in customers:customer.send(data)except(ConnectionResetError):print("----------客戶已下線----------")customers.remove(customer)def display_msg(customer,address):global customers# 上鎖,避免出現資源競爭lock2.acquire()customers.add(customer)lock2.release()while True:data = customer.recv(1024)# 判斷返回值,避免出現接收完信息后仍然反復打印if len(data) == 0:break# 向所有用戶發送信息send_all(data,address)if __name__ == '__main__':while True:# 等待客戶連接,阻塞式customer, address = server.accept()# 每連接一個客戶創建一個線程recv_thread = threading.Thread(target=display_msg,args=(customer,address))# 設置線程守護,一但主線程結束,所有線程停止。recv_thread.setDaemon(True)# 啟動線程recv_thread.start()客戶端
import socket import threading# 創建全局變量,用作兩個線程間判斷數據知否是自己發的依據 middle = ''# 查詢本機ip地址 def get_host_ip():try:s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)s.connect(('8.8.8.8', 80))ip = s.getsockname()[0]finally:s.close()return ipdef connect():lock = threading.Lock()# 創建客戶端customer = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 目標計算機IP地址IP = '***************'port = 12345# 連接目標計算機host = customer.connect((IP, port))return customerdef recv():while True:msg = customer.recv(1024)data = msg.decode("utf-8")if data == middle:continueprint("-----------------------------")print(f"{data}")print("-----------------------------")def send():global middlehost_ip = get_host_ip()while True:data = input()middle = host_ip +"發送:\n"+datacustomer.send(middle.encode('utf-8'))if __name__ == '__main__':customer = connect()t1 = threading.Thread(target=recv)t2 = threading.Thread(target=send)t1.start()t2.start()總結
以上是生活随笔為你收集整理的socket+threading实现python多人局域网聊天室的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 飞鸽TCP/IP 10106错误解决
- 下一篇: 世界杯开赛看球吃麻辣小龙虾