UDP簡介
UDP是OSI參考模型中一種無連接的傳輸層協(xié)議宪哩,它主要用于不要求分組順序到達的傳輸中邮偎,分組傳輸順序的檢查與排序由應用層完成心肪,提供面向事務的簡單不可靠信息傳送服務菩帝。UDP 協(xié)議基本上是IP協(xié)議與上層協(xié)議的接口络它。UDP協(xié)議使用端口分別運行在同一臺設備上的多個應用程序族檬。
UDP提供了無連接通信,且不對傳送數(shù)據(jù)包進行可靠性保證化戳,適合于一次傳輸少量數(shù)據(jù)单料,UDP傳輸?shù)目煽啃杂蓱脤迂撠煛3S玫腢DP端口號有:53(DNS)点楼、69(TFTP)扫尖、161(SNMP),使用UDP協(xié)議包括:TFTP掠廓、SNMP换怖、NFS、DNS蟀瞧、BOOTP沉颂。
UDP報文沒有可靠性保證、順序保證和流量控制字段等悦污,可靠性較差铸屉。但是正因為UDP協(xié)議的控制選項較少,在數(shù)據(jù)傳輸過程中延遲小切端、數(shù)據(jù)傳輸效率高彻坛,適合對可靠性要求不高的應用程序,或者可以保障可靠性的應用程序踏枣,如DNS小压、TFTP、SNMP等椰于。
Python實現(xiàn)簡易UDP程序
UDP server
#!/usr/bin/env python3
# -*- encoding = utf-8 -*-
# 該代碼由本人學習時編寫,僅供自娛自樂仪搔!
# 本人QQ:1945962391
# 歡迎留言討論瘾婿,共同學習進步!
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('客戶端程序已退出偏陪!服務端即將斷開')
time.sleep(1)
break
print('接收來自', ipaddr, '的數(shù)據(jù)抢呆!', '傳輸內(nèi)容為:', data)
except KeyboardInterrupt:
print('服務端準備退出!')
time.sleep(1)
sys.exit()
udp_socket.close()
運行效果
UDP client
#!/usr/bin/env python3
# -*- encoding = utf-8 -*-
# 該代碼由本人學習時編寫笛谦,僅供自娛自樂抱虐!
# 本人QQ:1945962391
# 歡迎留言討論,共同學習進步饥脑!
import socket
import sys
import time
server_ip = input('請輸入需要連接UDP服務端的IP地址:')
server_port = input('請輸入需要連接UDP服務端的端口號:')
ipaddress = (server_ip, int(server_port)) # 設置需要連接的服務端地址與端口
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 創(chuàng)建udp連接
udp_socket.connect(ipaddress) # 連接服務端
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()