日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python中的端口协议之基于UDP协议的通信传输

發(fā)布時間:2024/9/30 python 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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ā)效果
# 驗證UDP是否有粘包問題: from socket import * server = socket(AF_INET, SOCK_DGRAM) server.bind(('127.0.0.1', 8080))while True:data1, addr = server.recvfrom(1024)data2, addr = server.recvfrom(1024)data3, addr = server.recvfrom(1024)data4, addr = server.recvfrom(1024)data5, addr = server.recvfrom(1024)print(data1)print(data2)print(data3)print(data4)print(data5)from socket import * client = socket(AF_INET, SOCK_DGRAM)while True:client.sendto(b'Hello1', ('127.0.0.1', 8080))client.sendto(b'Hello2', ('127.0.0.1', 8080))client.sendto(b'Hello3', ('127.0.0.1', 8080))client.sendto(b'Hello4', ('127.0.0.1', 8080))client.sendto(b'Hello5', ('127.0.0.1', 8080))# 打印的每條數(shù)據(jù)都是獨立的,沒有2條數(shù)據(jù)在一起的情況 UDP不存在粘包問題,是由于UDP發(fā)送的時候,沒有經(jīng)過Nagle算法的優(yōu)化,不會將多個小包合并一次發(fā)送出去。另外,在UDP協(xié)議的接收端,采用了鏈式結(jié)構(gòu)來記錄每一個到達的UDP包,這樣接收端應(yīng)用程序一次recv只能從socket接收緩沖區(qū)中讀出一個數(shù)據(jù)包。也就是說,發(fā)送端send了幾次,接收端必須recv幾次(無論recv時指定了多大的緩沖區(qū))。

三、利用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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。