UDP簡介
UDP是OSI參考模型中一種無連接的傳輸層協(xié)議,它主要用于不要求分組順序到達的傳輸中,分組傳輸順序的檢查與排序由應(yīng)用層完成,提供面向事務(wù)的簡單不可靠信息傳送服務(wù)。UDP 協(xié)議基本上是IP協(xié)議與上層協(xié)議的接口。UDP協(xié)議使用端口分別運行在同一臺設(shè)備上的多個應(yīng)用程序。
UDP提供了無連接通信,且不對傳送數(shù)據(jù)包進行可靠性保證,適合于一次傳輸少量數(shù)據(jù),UDP傳輸?shù)目煽啃杂蓱?yīng)用層負責(zé)。常用的UDP端口號有:53(DNS)、69(TFTP)、161(SNMP),使用UDP協(xié)議包括:TFTP、SNMP、NFS、DNS、BOOTP。
UDP報文沒有可靠性保證、順序保證和流量控制字段等,可靠性較差。但是正因為UDP協(xié)議的控制選項較少,在數(shù)據(jù)傳輸過程中延遲小、數(shù)據(jù)傳輸效率高,適合對可靠性要求不高的應(yīng)用程序,或者可以保障可靠性的應(yīng)用程序,如DNS、TFTP、SNMP等。
Python實現(xiàn)簡易UDP程序
UDP server
#!/usr/bin/env python3
# -*- encoding = utf-8 -*-
# 該代碼由本人學(xué)習(xí)時編寫,僅供自娛自樂!
# 本人QQ:1945962391
# 歡迎留言討論,共同學(xué)習(xí)進步!
from Tools import GET_IP_netifaces
import socket
import sys
import time
localnets = input('請輸入需要監(jiān)聽的網(wǎng)卡名稱:')
localport = input('請輸入需要監(jiān)聽的端口:')
localip = GET_IP_netifaces.get_ip_address(localnets)
ipadress = (localip, int(localport))
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 創(chuàng)建udp的socket套接字
udp_socket.bind(ipadress) # 綁定ip地址及端口
print('Server端已準備就緒!等待數(shù)據(jù)傳輸')
while True:
try:
data, ipaddr = udp_socket.recvfrom(2048)
if not data:
print('客戶端程序已退出!服務(wù)端即將斷開')
time.sleep(1)
break
print('接收來自', ipaddr, '的數(shù)據(jù)!', '傳輸內(nèi)容為:', data)
except KeyboardInterrupt:
print('服務(wù)端準備退出!')
time.sleep(1)
sys.exit()
udp_socket.close()
運行效果

server端
UDP client
#!/usr/bin/env python3
# -*- encoding = utf-8 -*-
# 該代碼由本人學(xué)習(xí)時編寫,僅供自娛自樂!
# 本人QQ:1945962391
# 歡迎留言討論,共同學(xué)習(xí)進步!
import socket
import sys
import time
server_ip = input('請輸入需要連接UDP服務(wù)端的IP地址:')
server_port = input('請輸入需要連接UDP服務(wù)端的端口號:')
ipaddress = (server_ip, int(server_port)) # 設(shè)置需要連接的服務(wù)端地址與端口
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 創(chuàng)建udp連接
udp_socket.connect(ipaddress) # 連接服務(wù)端
while True:
try:
data = input('請輸入需要傳輸?shù)臄?shù)據(jù):')
if not data: # 如果無數(shù)據(jù)輸入,發(fā)送空數(shù)據(jù),并退出循環(huán)
udp_socket.sendto(data.encode(), ipaddress)
print('無數(shù)據(jù)輸入,程序即將退出!')
time.sleep(1)
break
else: # 否則傳輸數(shù)據(jù),繼續(xù)循環(huán)
udp_socket.sendto(data.encode(), ipaddress)
print('數(shù)據(jù)傳輸完畢!')
except KeyboardInterrupt: # 如客戶輸入ctrl+c,打印提示信息,退出程序
print('用戶手動退出程序!')
sys.exit()
udp_socket.close()
運行效果

client

server端接收數(shù)據(jù)