Python 網路編程之 TCP 與 UDP

来源:https://www.cnblogs.com/izbw/archive/2020/03/05/12423682.html
-Advertisement-
Play Games

Socket(套接字) 介紹 UDP 和 TCP 協議之前,先熟悉下 socket 的基本概念。 基本概念 Socket 是通信的基石,是支持 TCP/IP 協議的網路通信的基本操作單元,在網路通信過程中端點的一種抽象表示。網路中使用 Socket 傳輸數據是一種特殊的網路 I/O。 工作模式 打開 ...


Socket(套接字)

介紹 UDP 和 TCP 協議之前,先熟悉下 socket 的基本概念。

  • 基本概念

Socket 是通信的基石,是支持 TCP/IP 協議的網路通信的基本操作單元,在網路通信過程中端點的一種抽象表示。網路中使用 Socket 傳輸數據是一種特殊的網路 I/O。

  • 工作模式

打開open -> 讀寫write/read -> 關閉close

  • 五種信息

socket 包括了數據傳輸必須的五元組,分別為源IP、源埠、目的IP、目的埠和協議號

  • 通信機制

基於流(stream)或者基於數據報(datagram)

  • python 中使用
import socket

socket.socket(...)

UDP

UDP(User Datagram Protocol) 用戶數據報協議,是一種面向無連接的協議,提供簡單不可靠的信息傳輸服務,發送後不會確認信息是否到達。

UDP 通信模型中,在通信開始之前,不需要建立相關的鏈接,只需要發送數據即可,類似於生活中"寫信"。

  • 使用 socket 使用 UDP 的收發數據,先看原理圖

  • 客戶端代碼實現
# 客戶端 發送數據
# 1.創建udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
    send_data = input("請輸入要發送的數據:")
    if send_data == 'exit':
        break
    # 2.發送數據
    udp_socket.sendto(send_data.encode(), ("192.168.1.110", 8080)) # 對方的ip和port
    # 3.關閉套接字
udp_socket.close()
  • 服務端代碼實現
# 服務端 接收數據
HOST = '' # 空為localhost
PORT = 7788
ADDR = (HOST, PORT)
BUFSIZE = 1024  # 一次接收最大的尺寸

# 1.創建udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2.綁定本地套接字信息
udp_socket.bind(ADDR)  # 綁定必須是本機的ip和port
while True:
    # 3.接收數據
    data, addr = udp_socket.recvfrom(BUFSIZE)  # 返回接收數據和發送方的地址信息
    if data.decode() == 'exit':
        print("退出")
        break
    # 列印接收的數據
    print(f"{addr[0]}:{addr[1]}", data.decode())
# 4.關閉套接字
udp_socket.close()

套接字是可以同時收發數據,是全雙工狀態,在調用 recvform 之前收到數據,操作系統會將數據暫時儲存起來,等到程式調用 recvform 取出數據,在調用 recvform 之後未接收到數據,程式會進入阻塞狀態,等待數據的到來。

TCP

TCP(Transmission Control Protocol)傳輸控制協議,是一種面向連接的,可靠的基於位元組流的傳輸層通信協議。

TCP 通信需要經過創建連接數據傳送終止連接三個步驟。

TCP 通信模型中,在通信開始之前,一定要先建立相關的鏈接,才能發送數據,類似於生活中"打電話"。 這種連接是一對一的,因此TCP不適用於廣播的應用程式,基於廣播的應用程式請使用 UDP 協議

特點:

  • 面向連接(使用三次握手建立連接,連接已創建才作傳輸,採用四次揮手斷開連接。)

  • 有序數據傳輸
  • 重發丟失的數據包
  • 捨棄重覆的數據包
  • 無差錯的數據傳輸
  • 阻塞/流量控制

使用 socket 實現 TCP 的收發數據,先看原理圖

  • 客戶端代碼實現
# 客戶端
IPADDR = "192.168.1.110"
PORT = 7788
# 創建套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 連接伺服器,創建連接
tcp_socket.connect((IPADDR, PORT))
# 收發數據
send_data = input("輸入發送的數據:")
tcp_socket.send(send_data.encode())
# 關閉套接字,關閉連接
tcp_socket.close()
  • 服務端代碼實現
# 服務端

IPADDR = “”  # 預設localhost
PORT = 7788
BUFSIZE = 1024  # 一次接收最大的尺寸
print('server start...')
# 創建套接字(監聽套接字)  =》買個手機
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 綁定本地信息 =》 插入手機卡
tcp_socket.bind((IPADDR, PORT))
# 將手機設為正常,能夠響鈴 =》 讓預設的套接字由主動變為監聽
tcp_socket.listen(128)  # 同一時間,最大允許連接128個客戶端

while True:  # 迴圈為多個客戶端服務
    print("waitting connected...")
    # 等待電話到來 =》 等待別人電話的到來,此時程式會被阻塞,等待客戶端連接
    new_client_socket, client_addr = tcp_socket.accept()  # 新的專門為客戶端服務的socket,客戶端的addr
    # 接收客戶端發送過來的請求,此時程式會阻塞等待客戶端發送數據
    print("waitting recive data...")
    while True:  # 迴圈為同一個客戶端服務多次
        recv_data = new_client_socket.recv(BUFSIZE)
        # 如果recv 解堵塞,有兩種方式
        # 1.客戶端發送過來數據
        # 2.客戶端調用close斷開連接
        if recv_data:
            print(f"【{client_addr[0]}:{client_addr[1]}】", recv_data.decode())
            # 回送一部分數據給客戶端
            new_client_socket.send('收到'.encode())
        else:
            break
        # 關閉套接字
    new_client_socket.close()
    print("connect closed")
tcp_socket.close()
print('server end...')

監聽套接字負責等待有新的客戶端進行連接 accept 產生的新的套接字用來為客戶端服務 如果將監聽套接字關閉了,那麼會導致不能再次等待新客戶端的到來,accept() 會失敗 關閉 accept 返回的新的套接字,意味著不再為這個客戶端服務。


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

-Advertisement-
Play Games
更多相關文章
  • 定義和用法 pop() 方法用於刪除並返回數組的最後一個元素。 語法 ~~~ arrayObject.pop() ~~~ 返回值 arrayObject 的最後一個元素。 說明 pop() 方法將刪除 arrayObject 的最後一個元素,把數組長度減 1,並且返回它刪除的元素的值。如果數組已經為 ...
  • 定義和用法 join() 方法用於把數組中的所有元素放入一個字元串。 元素是通過指定的分隔符進行分隔的。 語法 ~~~ arrayObject.join(separator) ~~~ | 參數 | 描述 | | | | | separator | 可選。指定要使用的分隔符。如果省略該參數,則使用逗號 ...
  • `hasOwnProperty() true false`。 該方法屬於 對象,由於所有的對象都"繼承"了Object的對象實例,因此幾乎所有的實例對象都可以使用該方法。 IE 5.5+、FireFox、Chrome、Safari、Opera等主流瀏覽器均支持該函數。 語法 JavaScript: ...
  • google模式下: ie模式下: 火狐模式下: FILTER(ie模式);background: moz linear gradient(火狐模式);background: webkit gradient(谷歌模式)。 以上是為了區別不同瀏覽器的不同效果,我把色碼區別開了。為了相容所有瀏覽器的相同 ...
  • 目 錄 1. 概述... 2 2. 原有結構(帶kafka)... 2 3. 改造後的結構(去掉kafka)... 3 4. 對比... 4 1. 概述 我們主要面向鋼鐵行業工業互聯網公有雲和私有去建設,偏向PAAS層和SAAS層應用,框架是支撐這個體系建設。現在我們的公有雲的IAAS資源層使用的是 ...
  • 一、內容回顧 面向對象 單例模塊 單例模塊:設計模式 單例的應用場景 logging模塊 記錄日誌的 記錄錯誤、操作日誌 給程式員看的:①統計使用;②用來做故障排除的(debug);③記錄錯誤,完成優化代碼的。 logging.basicconig:①使用方便,②不能實現,編碼問題;不能同時向文件和 ...
  • 今日內容 1、mro演算法和super super()表示執行父類的方法。 2、正則表達式和re模塊 1. re模塊本身只是用來操作正則表達式。 (1)正則表達式 匹配字元串 表單驗證 爬蟲 (4)正則表達式規則(元字元,量詞) 3、量詞 ...
  • 一、正則常用的方法 1.match:從開始位置開始查找,一次匹配 2.sear​ch:從任何位置查找,一次匹配 3.findall​:全部匹配,返回列表 4.finditer​:全部匹配,返回迭代器 5.​split:分割字元串,返回列表 ​6.sub:替換 7.匹配中文 中文unicode編碼[u ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...