使用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

通訊效果圖