UDP:User Datagram Protocal 用戶數(shù)據(jù)報協(xié)議 是 OSI/RM 模型中隸屬于傳輸層的面向無連接的網(wǎng)絡(luò)數(shù)據(jù)傳輸協(xié)議
UDP數(shù)據(jù)傳輸速度快宵凌,不保證可靠傳輸洒扎。
UDP 服務(wù)端開發(fā)步驟如下:
? 引入依賴的模塊
? 定義服務(wù)器描述信息
? 創(chuàng)建 U DP 套接字對象 并綁定主機
? 消息循環(huán):和連接進入的客戶端之間發(fā)送 / 收取消息
? 關(guān)閉連接,釋放資源
代碼如下:
服務(wù)端代碼如下:
# 引入需要的包
import socket
# 定義服務(wù)器信息
HOST = ''
PORT = 9000
ADDRESS = (HOST, PORT)
BUFFER = 1024
# 創(chuàng)建UDP套接字對象
udp_server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 綁定主機
udp_server.bind(ADDRESS)
print("udp server is starting, waiting for data....")
# 不需要監(jiān)聽
while True:
# 接收數(shù)據(jù)
msg, addr = udp_server.recvfrom(BUFFER)
try:
print("client:", addr, msg.decode("utf-8"))
except:
print("client:", addr, msg.decode("gbk"))
# 發(fā)送數(shù)據(jù)
info = input("請輸入你要發(fā)送的數(shù)據(jù):")
udp_server.sendto(info.encode("utf-8"), addr)
# 服務(wù)器退出姨涡,先關(guān)套接字
udp_server.close()
客戶端代碼如下:
# 引入需要的包
import socket
# 定義連接信息
HOST = '192.168.13.38'
PORT = 9000
ADDRESS = (HOST, PORT)
BUFFER = 1024
# 創(chuàng)建套接字對象
udp_client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 收發(fā)消息
while True:
info = input("請輸入你要發(fā)送的消息:")
udp_client.sendto(info.encode("utf-8"), ADDRESS)
if info == "BYE":
udp_client.close()
break
# 接收消息
msg, addr = udp_client.recvfrom(BUFFER)
try:
print(addr, " say : ", msg.decode("utf-8"))
except:
print(addr, " say : ", msg.decode("gbk"))
面向?qū)ο蟮倪B接(socketserver)
socketserver 是 python 中提供的一個可以用于面向?qū)ο蠓?wù)端開發(fā)的一個高級模塊,封裝 了底層 socket 的大量操作實現(xiàn),通過提供面向?qū)ο蟮牟僮鞣绞胶喕绦蜷_發(fā)
? socketserver 模塊
BaseServer ???????基礎(chǔ)服務(wù)類型扑馁,包含核心功能
TCPServer/UDPServer TCP/UDP??????? 服務(wù)類型
UnixStreamServer/UnixDatagramServer ???????面向文件的 TCP/UDP 服務(wù)類型 ForkingMixin/ThreadingMixin ???????核心派生線程類型 ForkingTCPServer/ForkingUDPServer ???????線程派生類型和 TCP/UDP 混合類型
ThreadingTCPServer/ThreadingUDPServer ???????同上
BaseRequestHandler ???????基礎(chǔ)請求處理類型 StreamReqeustHandler/DatagramRequestHandler ???????面向連接/無連接的請求處理類型
基于 socketserver 的 TCP 服務(wù)端的編程開發(fā)
代碼如下:
# 引入需要的模塊
import socket
# 創(chuàng)建一個集合:用來存儲連接的多個客戶端
client_set = set()
# 定義服務(wù)器信息
HOST = ''
PORT = 22666
ADDRESS = (HOST, PORT)
BUFFERS = 1024
# 創(chuàng)建UDP服務(wù)器套接字并綁定當前主機
udp_server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_server.bind(ADDRESS)
# 消息的轉(zhuǎn)發(fā)
while True:
# 接受一個客戶端的消息
recv_msg, client_addr = udp_server.recvfrom(BUFFERS)
client_set.add(client_addr)
# 轉(zhuǎn)發(fā)給所有客戶端
for client in client_set:
udp_server.sendto(recv_msg, client)
客戶端代碼如下:
# 引入需要的包
import socket
# 連接主機的信息
HOST = '192.168.13.38'
PORT = 22666
ADDRESS = (HOST, PORT)
BUFFER = 1024
# 定義套接字連接對象
udp_client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 定義登記信息消息
info = input("請輸入你的昵稱:")
udp_client.sendto(info.encode("utf-8"), ADDRESS)
while True:
# 接受一次消息
msg, addr = udp_client.recvfrom(BUFFER)
print(addr, " say : ", msg.decode("utf-8"))
# 發(fā)送消息
info = input("消息:")
udp_client.sendto(info.encode("UTF-8"), ADDRESS)
UDP與TCP面向?qū)ο蟮木幊填愃贫滋茫煌牡胤皆谂cUDP導入的包與TCP不同UDP導入的包為:UDPServer 和 DatagramRequestHandler