使用python實現UDP編程
- 2019 年 10 月 4 日
- 筆記
UDP的生動理解
UDP說自己太難了,沒想到最後是一個舔狗。一般我們講技術的時候,都是講太多理論,搞得我們一臉懵逼,今天我們不這樣做,我們直接講一個生動的例子來講講 UDP
聽好了,有一天,醜男喜歡上一個美女了,並開始展開了死皮賴臉的的追求,他通過身邊的人搞到了美女的微信,QQ,每天都給美女發資訊,不管美女在不在線,每天都給美女買吃的,美女卻什麼也不恢復,不拒絕,就像懶蛤蟆想吃天鵝肉一樣,每天必舔一遍,最後發現美女一直吃著自己送給她的東西,跟著另外一個男人跑了,舔狗發出了慘叫聲,我太難了,最後死於非命。
例子僅僅是例子,是生動了一些,但是這樣我們更有畫面感,更有動力學習了,為什麼最後UDP變成了舔狗了呢?原來是這樣的,UDP在網路通訊方面是無鏈接狀態的,就好比舔狗發消息,美女不一定在線,不一定收得到,或許他的QQ,微信都是小號,哈哈,太給力了。是不需要確定對方能不能收到,直接發,不用建立連接。QQ發送資訊也是通過UDP協議,不用擔心收不到資訊。
說了這麼多,我們還是上圖比較明確一點,首先解釋一下,要當舔狗(client端),必須要到對方(server端)的正確的QQ號,微訊號,手機號,這就相當於網路中的IP,埠號一樣,只有綁定了這些東西,才能發送東西。

UDP 特性
- UDP 對數據的安全性,是否完整順序到底對方,對方是否接手沒有嚴格要求,繼承IP特性
- UDP 是面向無連接的,就像我們寄快遞一樣,我們只要把我們的送達地址寫好,至於採用什麼快遞都無所謂
- UDP 是一個一個的發,一個一個的收,數據格式基於數據報(包含報頭以及數據本身)
- UDP 是應用需要發,就會發送,不處理堵塞(不要把處理UDP程式寫在主執行緒裡面)
應用場景
- 廣播和多播應用必須使用UDP,也就是 一對多的情況
- 簡單的請求-應答應用程式可以使用UDP,對數據流,丟不丟包都沒關係,就可以使用UDP
- 對於海量數據傳輸不應該使用UDP,對數據傳輸比較嚴格
- DNS、NFS、流媒體傳輸等等
python 實現 UDP
首先是我們的 server.py
#coding:utf-8 from socket import * from time import ctime print("=====================時間戳UDP伺服器=====================") HOST = '' #主機號為空白表示可以使用任何可用的地址。 PORT = 28888 #埠號 BUFSIZ = 1024 #接收數據緩衝大小 ADDR = (HOST, PORT) udpSerSock = socket(AF_INET, SOCK_DGRAM) #創建udp伺服器套接字 udpSerSock.bind(ADDR) #套接字與地址綁定 while True: print('等待接收消息...') data, addr = udpSerSock.recvfrom(BUFSIZ) #連續接收指定位元組的數據,接收到的是位元組數組 udpSerSock.sendto(bytes('[%s] %s' % (ctime(), data.decode('utf-8')), 'utf-8'), addr) #向客戶端發送時間戳數據,必須發送位元組數組 print('響應消息到', addr) udpSerSock.close() #關閉伺服器socket
接下來是我們的 client.py
#coding:utf-8 from socket import * print("=====================UDP客戶端=====================") HOST = '127.0.0.1' #本機測試 PORT = 28888 #埠號 BUFSIZ = 1024 #接收消息的緩衝大小 ADDR = (HOST, PORT) udpCliSock = socket(AF_INET, SOCK_DGRAM) #創建客戶端套接字 while True: data = input('> ') #接收用戶輸入 if not data: #如果用戶輸入為空,直接回車就會發送"",""就是代表false break udpCliSock.sendto(bytes(data,'utf-8'), ADDR) #客戶端發送消息,必須發送位元組數組 data, ADDR = udpCliSock.recvfrom(BUFSIZ) #接收回應消息,接收到的是位元組數組 if not data: #如果接收伺服器資訊失敗,或沒有消息回應 break print(str(data,'utf-8')) #列印回應消息 udpCliSock.close()#關閉客戶端socket
通訊效果圖

