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