Python中的端口协议之基于UDP协议的通信传输
生活随笔
收集整理的這篇文章主要介紹了
Python中的端口协议之基于UDP协议的通信传输
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
閱讀目錄
UDP協議:
- 1、python中基于udp協議的客戶端與服務端通信簡單過程實現
- 2、udp協議的一些特點(與tcp協議的比較)
- 3、利用socketserver模塊實現udp傳輸協議的并發通信
一、UDP協議:OSI七層協議中的傳輸協議的一種(另外一種tcp協議),他們都是一種端口協議
-
與TCP協議不同的是,UDP協議在傳輸時候無需雙方建立雙向連接,只需要知道對方的IP和PORT(端口)就可以
而且UDP協議傳輸具有不安全行,或者說是即時性,給對方發送信息時候,只管發,至于他收不收得到都不會去考慮,不管是服務端還是客戶端都一樣。
-
UDP叫數據報協議,意味著發消息都帶有數據報頭,UDP的server不需要進行監聽也無需建立連接,在啟動服務之后只能被動的等待客戶端發消息過來,客戶端發消息的時候,要帶上服務端的地址,服務端在回消息的時候,也要帶上客戶端的地址
下面來簡單實現基于UDP協議的客戶端、服務端通信
-------------------------------------------------------------------- 注:如果你對python感興趣,我這有個學習Python基地,里面有很多學習資料,感興趣的+Q群:895817687 --------------------------------------------------------------------# 服務端:import socket # udp傳輸的服務端無需半連接池,因為通信無需建立雙向連接通道,無需三次握手四次揮手,只要知道對方ip和port就行 server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) server.bind(('127.0.0.1', 8080))# 通信循環 while True:data, client_addr = server.recvfrom(1024) # 這里接收用recvfromprint('收到客戶端發來的udp消息%s' % data.decode('utf-8'))server.sendto(data.upper(), client_addr) # 這里發送用sendto# 客戶端:import socket # 無需connect服務端,因為發送時候跟上服務端ip和port就行 client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)while True:msg = 'hello'client.sendto(msg.encode('utf-8'), ('127.0.0.1', 8080))data, server_addr = client.recvfrom(1024)print(data.decode('utf-8'))二、UDP協議的一些特點
總結幾個UDP協議的特點:
- 客戶端允許發空
- 不會粘包
- 服務端不存在的時候,客戶端照發無誤,不會報錯(-)
- 可以實現簡單的并發效果
三、利用socketserver模塊實現udp協議的并發通信
## 服務端: import socketserver from threading import currentThread # 這里導入當前線程方法,得到當前線程名稱class MyUdpHandler(socketserver.BaseRequestHandler):def handle(self):# 這里和tcp利用socketserver模塊并發的服務端不一樣,tcp服務端是直接data = self.request.recv(1024)data, sock = self.request # 這里多了一個sock,這個sock用于發送,同時self對象本身可以得到client_address msg = '%s [%s]' % (currentThread().name, data.upper().decode('utf-8'))sock.sendto(msg.encode('utf-8'), self.client_address)if __name__ == '__main__':server = socketserver.ThreadingUDPServer(('127.0.0.1', 8080), MyUdpHandler)server.serve_forever()## 客戶端 from threading import Thread,currentThread import time from socket import * def task():client = socket(AF_INET,SOCK_DGRAM)addr = ('127.0.0.1', 8080)n = 0while n < 10: # 模擬讓每個客戶端與服務端通信循環10次。msg = '%s [%s]' % (currentThread().name, n)client.sendto(msg.encode('utf-8'), addr)data, addr0 = client.recvfrom(1024)print(data.decode('utf-8'))n += 1if __name__ == '__main__':for i in range(50): # 開啟50個客戶端線程去連接服務端,模擬并發t = Thread(target=task)t.start()總結
以上是生活随笔為你收集整理的Python中的端口协议之基于UDP协议的通信传输的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中的线程
- 下一篇: websocket python爬虫_p