一、UDP簡介
- UDP適用於對效率要求相對較高而對准確性要求相對較低的場合,例如視頻在線點播、網絡語音通話等等。
- socket模塊中經常用於UDP編程的方法主要有:
- socket([family[,type[,proto]]]):創建一個socket對象,其中family為socket.AF_INET表示IPV4,socket.AF_INET6表示IPV6;type為SOCK_STREAM表示TCP協議,SOCK_DGRAM表示UDP協議。
- sendto(string,address):把string指定的字節串內容發送給address指定的地址,address是一個元組,格式為(IP地址,端口號)
- recvfrom(bufsize[,flags]):接收數據
二、實例
編寫UDP通信程序,發送端發送一個字符串“Hello world!”。接收端在計算機的5000端口進行接收,並顯示接收內容,如果收到字符串bye(忽略大小寫)則結束監聽。
接收端代碼:
1 接收端代碼receiver.py: 2 import socket 3 # 使用IPV4協議,使用UDP協議傳輸數據
4 s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 5 # 綁定端口和端口號,空字符串表示本機任何可用IP地址
6 s.bind(('', 5000)) 7 while True: 8 data, addr = s.recvfrom(1024) 9 # 顯示接收到的內容
10 data = data.decode() 11 print('received message:{0} from PORT {1[1]} on {1[0]}'.format(data, addr)) 12 if data.lower() == 'bye': 13 break
14 s.close( )
發送端代碼:
1 發送端代碼sender.py: 2
3 import socket 4 import sys 5 s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 6 # 假設192.168.0.103是接收端機器的IP地址
7 s.sendto(sys.argv[1].encode() , ("192.168.0.103" ,5000)) 8 s.close()
然后啟動一個命令提示符環境並運行接收端程序,這時接收端程序處於阻塞狀態,接下來再啟動一個新的命令提示符環境並運行發送端程序,此時會看到接收端程序繼續運行並顯示接收到的內容以及發送端程序所在計算機IP地址和占用的端口號。
當發送端發送字符串bye后,接收端程序結束,此后再次運行發送端程序時接收端沒有任何反應,但發送端程序也並不報錯。這正是UDP協議的特點,即“盡最大努力傳輸”,並不保證非常好的服務質量。
三、運行UDP過程中出現的問題及其解決
剛開始運行時顯示有錯誤,查閱資料后發現是代碼縮進有問題
經過修改后,成功運行UDP通訊程序(結果如下圖)