原創: 志學Python 志學Python
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
通訊效果圖
最后,我自己是一名從事了多年開發的Python老程序員,辭職目前在做自己的Python私人定制課程,今年年初我花了一個月整理了一份最適合2019年學習的Python學習干貨,可以送給每一位喜歡Python的小伙伴,想要獲取的可以關注我的頭條號并在后臺私信我:01,即可免費獲取。






