Python群聊 UDP實現

2021-09-26 05:51:31 字數 3703 閱讀 2285

方法:

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...