Python中的埠協議之基於UDP協議的通信傳輸

来源:https://www.cnblogs.com/suguangti/archive/2019/05/19/10891403.html
-Advertisement-
Play Games

UDP協議: 1、python中基於udp協議的客戶端與服務端通信簡單過程實現 2、udp協議的一些特點(與tcp協議的比較) 3、利用socketserver模塊實現udp傳輸協議的併發通信 一、UDP協議:OSI七層協議中的傳輸協議的一種(另外一種tcp協議),他們都是一種埠協議 與TCP協議 ...


UDP協議:

  1、python中基於udp協議的客戶端與服務端通信簡單過程實現

  2、udp協議的一些特點(與tcp協議的比較)

       3、利用socketserver模塊實現udp傳輸協議的併發通信

-------------------------------------------------------------------------------------------------------------------------------------

一、UDP協議:OSI七層協議中的傳輸協議的一種(另外一種tcp協議),他們都是一種埠協議

  • 與TCP協議不同的是,UDP協議在傳輸時候無需雙方建立雙向連接,只需要知道對方的IP和PORT(埠)就可以

  而且UDP協議傳輸具有不安全行,或者說是即時性,給對方發送信息時候,只管發,至於他收不收得到都不會去考慮,

  不管是服務端還是客戶端都一樣。

  • UDP叫數據報協議,意味著發消息都帶有數據報頭,UDP的server不需要進行監聽也無需建立連接,在啟動服務之後只能被動的等待客戶端發消息過來,客戶端發消息的時候,要帶上服務端的地址,服務端在回消息的時候,也要帶上客戶端的地址

  下麵來簡單實現基於UDP協議的客戶端、服務端通信

#  服務端:

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)  # 這裡接收用recvfrom
    print('收到客戶端發來的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協議的特點:

  • 客戶端允許發空
  • 不會粘包
  • 服務端不存在的時候,客戶端照發無誤,不會報錯(*-*)
  • 可以實現簡單的併發效果
    # 驗證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))
    
    # 列印的每條數據都是獨立的,沒有2條數據在一起的情況
    UDP不存在粘包問題,是由於UDP發送的時候,沒有經過Nagle演算法的優化,不會將多個小包合併一次發送出去。另外,在UDP協議的接收端,採用了鏈式結構來記錄每一個到達的UDP包,這樣接收端應用程式一次recv只能從socket接收緩衝區中讀出一個數據包。也就是說,發送端send了幾次,接收端必須recv幾次(無論recv時指定了多大的緩衝區)。

三、利用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 = 0
    while 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 += 1

if __name__ == '__main__':
    for i in range(50):    # 開啟50個客戶端線程去連接服務端,模擬併發
        t = Thread(target=task)
        t.start()

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Map的繼承關係: Map介面的常用實現類: 1、HashMap、Hashtable(t是小寫) HashMap不是線程安全的,key、value的值都可以是null。 Hashtable是線程安全的,key、value的值都不能是null。 HashMap、Hashtable都是無序的。 如果要使 ...
  • TableGo是基於資料庫的代碼自動生成工具,可以根據資料庫表結構自動生成JavaBean、生成MyBaits的Mapper映射配置文件、生成資料庫設計文檔、生成前後端代碼等,更重要的是可以根據每個項目的不同開發框架編寫自定義模板生成各模塊增刪查改的前後端代碼,讓開發人員的開發效率提高60%以上,... ...
  • Consumer是java8提供的函數式介面之一,意思為消費者,接受參數而不返回值 方法示例 這個是錯誤示例,(a) -> a * 2是編譯不通過的,因為Consumer是沒有返回值的,lambda一行的時候預設帶return Bad return type in lambda expression ...
  • 進行JavaWeb開發,我們總共需要5個步驟:JDK的安裝與配置;Tomcat的安裝;EclipseEE的安裝與配置;創建工程;編寫代碼並運行。安裝的三個軟體在版本和適用構架上要一致。當JDK是32位時,Tomcat和EclipseEE也都必須是32位的軟體。在版本的選擇上JDK8版本可以使用Tom... ...
  • Map是雙列集合的根介面,用於存儲具有映射關係的數據。 根據key來區分每一項、獲取對應的value,所以key不能重覆。 key、value都可以是任意類型的數據。 Map提供了一個內部類Entry用來封裝鍵值對,一個鍵值對就是一個Entry實例。 Map的常用方法(所有子類都可以直接使用): v ...
  • 現象: 報錯:Exception in thread "main" com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure 解決辦法: 更換 mysql-connector-java-8.0. ...
  • 一、單體架構的問題 微服務為什麼會出現?在學習Springboot的時候知道Springboot極大的簡化了我們的開發,我們可以快速的進行業務開發,Springboot單體應用在項目的開發初期能夠滿足我們需求,這種單體架構優點非常的明顯: 容易測試:本地就可以起完整的系統,不需要外部依賴。 容易開發 ...
  • 在Kinect for windows SDK2.0中,獲取並處理數據源介面步驟如下: Sensor -> Source -> Reader -> Frame -> Data (一)SensorIKinectSensor *pSensor=nullptr; //定義類指針GetDefaultKine ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...