原創(chuàng): 志學(xué)Python 志學(xué)Python
UDP的生動(dòng)理解
UDP說(shuō)自己太難了,沒(méi)想到最后是一個(gè)舔狗。一般我們講技術(shù)的時(shí)候,都是講太多理論,搞得我們一臉懵逼,今天我們不這樣做,我們直接講一個(gè)生動(dòng)的例子來(lái)講講 UDP
聽(tīng)好了,有一天,丑男喜歡上一個(gè)美女了,并開(kāi)始展開(kāi)了死皮賴臉的的追求,他通過(guò)身邊的人搞到了美女的微信,QQ,每天都給美女發(fā)信息,不管美女在不在線,每天都給美女買吃的,美女卻什么也不恢復(fù),不拒絕,就像懶蛤蟆想吃天鵝肉一樣,每天必舔一遍,最后發(fā)現(xiàn)美女一直吃著自己送給她的東西,跟著另外一個(gè)男人跑了,舔狗發(fā)出了慘叫聲,我太難了,最后死于非命。
例子僅僅是例子,是生動(dòng)了一些,但是這樣我們更有畫面感,更有動(dòng)力學(xué)習(xí)了,為什么最后UDP變成了舔狗了呢?原來(lái)是這樣的,UDP在網(wǎng)絡(luò)通信方面是無(wú)鏈接狀態(tài)的,就好比舔狗發(fā)消息,美女不一定在線,不一定收得到,或許他的QQ,微信都是小號(hào),哈哈,太給力了。是不需要確定對(duì)方能不能收到,直接發(fā),不用建立連接。QQ發(fā)送信息也是通過(guò)UDP協(xié)議,不用擔(dān)心收不到信息。
說(shuō)了這么多,我們還是上圖比較明確一點(diǎn),首先解釋一下,要當(dāng)舔狗(client端),必須要到對(duì)方(server端)的正確的QQ號(hào),微信號(hào),手機(jī)號(hào),這就相當(dāng)于網(wǎng)絡(luò)中的IP,端口號(hào)一樣,只有綁定了這些東西,才能發(fā)送東西。
UDP 特性
- UDP 對(duì)數(shù)據(jù)的安全性,是否完整順序到底對(duì)方,對(duì)方是否接手沒(méi)有嚴(yán)格要求,繼承IP特性
- UDP 是面向無(wú)連接的,就像我們寄快遞一樣,我們只要把我們的送達(dá)地址寫好,至于采用什么快遞都無(wú)所謂
- UDP 是一個(gè)一個(gè)的發(fā),一個(gè)一個(gè)的收,數(shù)據(jù)格式基于數(shù)據(jù)報(bào)(包含報(bào)頭以及數(shù)據(jù)本身)
- UDP 是應(yīng)用需要發(fā),就會(huì)發(fā)送,不處理堵塞(不要把處理UDP程序?qū)懺谥骶€程里面)
應(yīng)用場(chǎng)景
- 廣播和多播應(yīng)用必須使用UDP,也就是 一對(duì)多的情況
- 簡(jiǎn)單的請(qǐng)求-應(yīng)答應(yīng)用程序可以使用UDP,對(duì)數(shù)據(jù)流,丟不丟包都沒(méi)關(guān)系,就可以使用UDP
- 對(duì)于海量數(shù)據(jù)傳輸不應(yīng)該使用UDP,對(duì)數(shù)據(jù)傳輸比較嚴(yán)格
- DNS、NFS、流媒體傳輸?shù)鹊?/li>
python 實(shí)現(xiàn) UDP
首先是我們的 server.py
#coding:utf-8 from socket import * from time import ctime print("=====================時(shí)間戳UDP服務(wù)器=====================") HOST = '' #主機(jī)號(hào)為空白表示可以使用任何可用的地址。 PORT = 28888 #端口號(hào) BUFSIZ = 1024 #接收數(shù)據(jù)緩沖大小 ADDR = (HOST, PORT) udpSerSock = socket(AF_INET, SOCK_DGRAM) #創(chuàng)建udp服務(wù)器套接字 udpSerSock.bind(ADDR) #套接字與地址綁定 while True: print('等待接收消息...') data, addr = udpSerSock.recvfrom(BUFSIZ) #連續(xù)接收指定字節(jié)的數(shù)據(jù),接收到的是字節(jié)數(shù)組 udpSerSock.sendto(bytes('[%s] %s' % (ctime(), data.decode('utf-8')), 'utf-8'), addr) #向客戶端發(fā)送時(shí)間戳數(shù)據(jù),必須發(fā)送字節(jié)數(shù)組 print('響應(yīng)消息到', addr) udpSerSock.close() #關(guān)閉服務(wù)器socket
接下來(lái)是我們的 client.py
#coding:utf-8 from socket import * print("=====================UDP客戶端=====================") HOST = '127.0.0.1' #本機(jī)測(cè)試 PORT = 28888 #端口號(hào) BUFSIZ = 1024 #接收消息的緩沖大小 ADDR = (HOST, PORT) udpCliSock = socket(AF_INET, SOCK_DGRAM) #創(chuàng)建客戶端套接字 while True: data = input('> ') #接收用戶輸入 if not data: #如果用戶輸入為空,直接回車就會(huì)發(fā)送"",""就是代表false break udpCliSock.sendto(bytes(data,'utf-8'), ADDR) #客戶端發(fā)送消息,必須發(fā)送字節(jié)數(shù)組 data, ADDR = udpCliSock.recvfrom(BUFSIZ) #接收回應(yīng)消息,接收到的是字節(jié)數(shù)組 if not data: #如果接收服務(wù)器信息失敗,或沒(méi)有消息回應(yīng) break print(str(data,'utf-8')) #打印回應(yīng)消息 udpCliSock.close()#關(guān)閉客戶端socket
通訊效果圖
最后,我自己是一名從事了多年開(kāi)發(fā)的Python老程序員,辭職目前在做自己的Python私人定制課程,今年年初我花了一個(gè)月整理了一份最適合2019年學(xué)習(xí)的Python學(xué)習(xí)干貨,可以送給每一位喜歡Python的小伙伴,想要獲取的可以關(guān)注我的頭條號(hào)并在后臺(tái)私信我:01,即可免費(fèi)獲取。