日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

socket+threading实现python多人局域网聊天室

發布時間:2023/12/18 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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多人局域网聊天室的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。