方法:
1.udp協議
2.多執行緒
服務端:
import socket
import threading
'''主線程實現管理員功能,分支執行緒實現新增使用者與資訊的**
'''sock = socket.socket(socket.af_inet,socket.sock_dgram)
sock.bind(("0.0.0.0",8888))
# 儲存進入群聊的使用者名稱
user = {}
# 分支執行緒執行函式
def forward(user):
while true:
data,addr = sock.recvfrom(5120)
en_data = data.decode("utf-8")
# 處理客戶端進入請求
if en_data[0] == "*":
ls_data = en_data.split(" ")
if ls_data[1] in user:
sock.sendto("00".encode(), addr) # 表示重名
continue
sock.sendto("成功進入群聊".encode("utf-8"),addr)
for u in user:
sock.sendto(("%s進入群聊" % ls_data[1]).encode("utf-8"), user[u])
print("\n%s進入群聊\n請管理員輸入資訊:" % ls_data[1], end="")
user[ls_data[1]] = addr
# 處理客戶端退出請求
elif en_data[0] == "#":
ls_data = en_data.split(" ")
for u in user:
if u == ls_data[1]:
continue
sock.sendto(("%s退出群聊" % ls_data[1]).encode("utf-8"), user[u])
print("\n%s退出群聊\n請管理員輸入資訊:" % ls_data[1], end="")
del user[ls_data[1]]
# **資訊
else:
for u in user:
if user[u] == addr:
continue
sock.sendto(data, user[u])
# 建立分支執行緒
thread1 = threading.thread(name="分支執行緒1",target=forward,args=(user,),kwargs={})
thread1.daemon = true #設定分支執行緒隨主線程的退出而退出
thread1.start()
while true:
data = input("請管理員輸入資訊:")
if data == "#":
# 退出服務端
break
send_data = "管理員說:%s" % data
for u in user:
sock.sendto(send_data.encode("utf-8"),user[u])
sock.close()
客戶端:
import socket
import threading
'''主程序負責傳送資訊,分支程序負責接收資訊
使用狀態變數控制控制台的使用權
'''sock = socket.socket(socket.af_inet,socket.sock_dgram)
addr = ("127.0.0.1",8888)
# 儲存對話資訊
recv_data =
# 儲存程式狀態,若為空字串為輸入狀態,此時只會接收服務端資訊,而不會在控制台列印
state = "0"
# 請求進入群聊
while true:
name = input("請輸入使用者名稱:")
if "#" in name:
print("使用者名稱中不能包含#號")
continue
if "管理員" in name:
print("使用者名稱中不能包含『管理員』")
continue
sock.sendto(("* %s" % name).encode("utf-8"),addr)
ser_data,ser_addr = sock.recvfrom(1024)
if ser_data.decode("utf-8") == "00":
print("使用者名稱重複")
continue
print(ser_data.decode("utf-8"))
break
# 分支執行緒執行函式
def client_recv():
global state
while true:
ser_data,ser_addr = sock.recvfrom(5120)
if state == "":
continue
print(ser_data.decode("utf-8"))
# 建立分支執行緒
thread = threading.thread(name="分支執行緒",target=client_recv,args=(),kwargs={})
thread.daemon = true #設定分支執行緒隨主線程的退出而退出
thread.start()
# 向服務端傳送資訊
while true:
# 按回車進入輸入狀態
state = input()
data = input("我說:")
if data == "":
for re in recv_data:
print(re)
recv_data.clear()
state = "0"
continue
if data[0] == "*":
print("請勿以*號開頭")
for re in recv_data:
print(re)
recv_data.clear()
state = "0"
continue
# 輸入#號退出
if data[0] == "#":
con = input("以#號開頭表示退出群聊,輸入1確認退出,輸入0重新輸入:")
if con == "0":
for re in recv_data:
print(re)
recv_data.clear()
state = "0"
continue
sock.sendto(("# %s" % name).encode("utf-8"), addr)
print("已退出群聊")
break
sock.sendto(("%s說:%s" % (name, data)).encode("utf-8"), addr)
for re in recv_data:
print(re)
recv_data.clear()
state = "0"
sock.close()
C Sockets程式設計實現群聊
伺服器 class server ipendpoint ipandpo new ipendpoint ipadd,port 獲得ip和埠號 socket.bind ipandpo 繫結ip和埠號並關聯 console.writeline 伺服器建立成功 socket.listen 0 建立監聽,0表...
python實現UDP通訊
python可以通過socket模組進行網路中的計算機相互通訊。socket也就是套接字,理解套接字,可以認為他就是ip位址,埠,和應用協議組成的。自己是這麼認為的 網際網路中的每一台主機,都是通過ip位址來標識的,通過ip位址可以訪問一台主機,想要和另外一台主機的 相關程式進行連線就需要通過por...
python實現UDP通訊
伺服器端sever usr bin python import socket address 127.0.0.1 10000 s socket.socket socket.af inet,socket.sock dgram s.bind address while 1 data,addr s.rec...