python之TCP的網絡應用程序開發

文章目錄

  • 版權聲明
  • python3編碼轉換
  • socket類的使用
    • 創建Socket對象
    • Socket對象常用方法和參數
    • 使用示例
      • 服務器端代碼
      • 客戶端代碼
  • TCP客戶端程序開發流程
  • TCP服務端程序開發流程
  • TCP網絡應用程序注意點
  • socket之send和recv原理剖析
    • send原理剖析
    • recv原理剖析
    • send和recv原理剖析圖
  • 多任務版TCP服務端程序開發

版權聲明

  • 本博客的內容基于我個人學習黑馬程序員課程的學習筆記整理而成。我特此聲明,所有版權屬于黑馬程序員或相關權利人所有。本博客的目的僅為個人學習和交流之用,并非商業用途。
  • 我在整理學習筆記的過程中盡力確保準確性,但無法保證內容的完整性和時效性。本博客的內容可能會隨著時間的推移而過時或需要更新。
  • 若您是黑馬程序員或相關權利人,如有任何侵犯版權的地方,請您及時聯系我,我將立即予以刪除或進行必要的修改。
  • 對于其他讀者,請在閱讀本博客內容時保持遵守相關法律法規和道德準則,謹慎參考,并自行承擔因此產生的風險和責任。本博客中的部分觀點和意見僅代表我個人,不代表黑馬程序員的立場。

python3編碼轉換

  • 在網絡傳輸數據的時候,數據需要先編碼轉化為二進制(bytes)數據類型
    在這里插入圖片描述
函數名說明
encode編碼 將字符串轉化為字節碼
decode解碼 將字節碼轉化為字符串
  • encoed()和decode()函數可以接受參數,encoding是指在編解碼過程中使用的編碼方案。
    bytes.decode(encoding=“utf-8)
    str.encode(encoding=”utf-8)
    

socket類的使用

  • Python的 socket 類是Python標準庫的一部分,用于提供對低級網絡接口的訪問。支持IPv4、IPv6、TCP、UDP等協議,允許創建基于網絡的應用程序,如服務器和客戶端。

創建Socket對象

  • 要使用 socket 類,首先需要導入 socket 模塊,然后創建一個 socket 對象。可以通過調用 socket.socket() 方法并傳遞相應的參數來創建一個socket。
    import socket
    # 創建一個socket對象,默認是IPv4和TCP協議
    # socket.socket(AddressFamily, Type)
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    

Socket對象常用方法和參數

方法/參數類型/描述示例/默認值說明
socket()構造函數用于創建socket對象
family參數socket.AF_INET地址族,確定了socket的類型(IPv4或IPv6)
type參數socket.SOCK_STREAM指定了socket的通信類型(TCP或UDP)
proto參數0協議編號,默認為0,由系統選擇合適的協議
fileno參數None可以指定一個文件描述符
bind(address)方法綁定地址到socket
address參數('localhost', 12345)一個包含主機名和端口號的元組
listen(backlog)方法開始監聽傳入連接
backlog參數5定義了等待隊列的大小
accept()方法接受一個連接,返回(conn, address)
connect(address)方法用于客戶端連接服務器
send(bytes)方法發送數據,參數為字節數據
recv(bufsize)方法接收數據,指定最大數據量
bufsize參數1024接收數據的緩沖區大小
close()方法關閉socket連接

使用示例

服務器端代碼

import socket# 創建socket對象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 綁定地址(host,port)
server_socket.bind(('localhost', 12345))# 開始監聽
server_socket.listen()print("服務器啟動,等待連接...")# 接受連接
connection, address = server_socket.accept()
print(f"連接來自 {address}")# 接收數據
data = connection.recv(1024)
print(f"接收到的數據: {data.decode()}")# 發送數據
connection.send("Hello, client!".encode())# 關閉連接
connection.close()

客戶端代碼

import socket# 創建socket對象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 連接服務器
client_socket.connect(('localhost', 12345))# 發送數據
client_socket.send("Hello, server!".encode())# 接收數據
data = client_socket.recv(1024)
print(f"接收到的數據: {data.decode()}")# 關閉連接
client_socket.close()

這僅僅是一個非常簡單的例子,實際應用中還需要處理錯誤、多線程或多進程處理多個連接、非阻塞IO等復雜情況。

TCP客戶端程序開發流程

  • TCP網絡應用程序開發分為:

    • TCP客戶端程序開發,運行在服務器設備上的程序,專門為客戶端提供數據服務。
    • TCP服務端程序開發,運行在用戶設備上的程序
  • TCP客戶端程序開發流程

    1. 創建客戶端套接字對象(買電話)
    2. 和服務端套接字建立連接(打電話)
    3. 發送數據(說話)
    4. 接收數據(接聽)
    5. 關閉客戶端套接字(掛電話)
      在這里插入圖片描述
  • TCP客戶端開發程序流程

    1. 創建客戶端套接字對象
    2. 和服務端套接字建立連接
    3. 發送數據
    4. 接收數據
    5. 關閉客戶端套接字
import socketif __name__ == '__main__':# 1.創建客戶端套接字對象tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 2.和服務端套接字建立連接tcp_client_socket.connect(("localhost", 8080))# 3.發送數據tcp_client_socket.send("hello".encode(encoding="utf-8"))# 4.接收數據 recv阻塞等待數據的到來recv_data = tcp_client_socket.recv(1024)print(recv_data.decode())# 5.關閉客戶端套接字tcp_client_socket.close()

TCP服務端程序開發流程

在這里插入圖片描述

  1. 創建服務端端套接字對象
  2. 綁定IP地址和端口號
  3. 設置監聽
  4. 等待接受客戶端的連接請求
  5. 接收數據
  6. 發送數據
  7. 關閉套接字
import socketif __name__ == '__main__':# 1.創建服務端套接字對象tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 2. 綁定IP地址和端口號# bind中的參數第一個ip地址元素設置為"",默認為本機ip地址tcp_server_socket.bind(("", 8080))# 3.設置監聽 128:代表服務端等待排隊連接的最大數量tcp_server_socket.listen(128)# 4.等待接受客戶端的連接請求 accept阻塞等待 返回一個用以和客戶端通socket,客戶端的地址conn_socket, ip_port = tcp_server_socket.accept()print("客戶端地址:", ip_port)# 5.接收數據recv_data = conn_socket.recv(1024)print("接收到的數據:", recv_data.decode())# 6.發送數據conn_socket.send("客戶端你的數據我收到了".encode())# 7.關閉套接字conn_socket.close()tcp_server_socket.close()

TCP網絡應用程序注意點

  1. 當TCP客戶端程序想要和TCP服務端程序進行通信的時候必須要先建立連接
  2. TCP客戶端程序一般不需要綁定端口號,因為客戶端是主動發起建立連接的
  3. TCP服務端程序必須綁定端口號,否則客戶端找不到這個TCP服務端程序。
  4. listen后的套接字是被動套接字,只負責接收新的客戶端的連接請求,不能收發消息
  5. 當TCP客戶端程序和TCP服務端程序連接成功后,TCP服務器端程序會產生一個新的套接字,收發客戶端消息使用該套接字.
  6. 關閉accept返回的套接字意味著和客戶端已經通信完畢當客戶端的套接字調用close后,服務器端的recv會解阻塞,返回的數據長度為0,服務端可以通過返回數據的長度來判斷客戶端是否已經下線,反之服務端關閉套接字,客戶端的recv也會解阻塞,返回的數據長度也為0。

socket之send和recv原理剖析

  • 當創建一個TCP socket對象的時候會有一個發送緩沖區和一個接收緩沖區,這個發送和接收緩沖區指的就是內存中的一片空間。

send原理剖析

  • send發送數據給服務端:必須得通過網卡發送數據,應用程序是無法直接通過網卡發送數據的,它需要調用操作系統接口,也就是說,應用程序把發送的數據先寫入到發送緩沖區(內存中的一片空間),再由操作系統控制網卡把發送緩沖區的數據發送給服務端網卡。

recv原理剖析

  • recv從客戶端接收數據:應用軟件是無法直接通過網卡接收數據的,它需要調用操作系統接口,由操作系統通過網卡接收數據,把接收的數據寫入到接收緩沖區(內存中的一片空間),應用程序再從接收緩存區獲取客戶端發送的數據。

send和recv原理剖析圖

在這里插入圖片描述

  • 不管是recv還是send都不是直接接收到對方的數據和發送數據到對方,發送數據會寫入到發送緩沖區,接收數據是從接收緩沖區來讀取,發送數據和接收數據最終是由操作系統控制網卡來完成。

多任務版TCP服務端程序開發

  • 實現步驟分析:
    在這里插入圖片描述
  1. 編寫一個TCP服務端程序,循環等待接受客戶端的連接請求

    while True:service_client_socket, ip_port = tcp_server_socket.accept()
    
  2. 當客戶端和服務端建立連接成功,創建子線程,使用子線程專門處理客戶端的請求,防止主線程阻塞

while True:service_client_socket, ip_port = tcp_server_socket.accept()sub_thread = threading.Thread(target=handle_client_request, args=(service_client_socket, ip_port))sub_thread.start()
  • 完整代碼:
import socket
import threading# 處理客戶端函數
def handle_client(conn_socket):# 5.接收數據recv_data = conn_socket.recv(1024)print("接收到的數據:", recv_data.decode())# 6.發送數據conn_socket.send("收到客戶端數據:".encode())# 7.關閉套接字conn_socket.close()# 1 使用循環接收客戶端的連接請求
if __name__ == '__main__':# 1.創建服務端套接字對象tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 設置端口號復用,讓程序退出端口號立即釋放tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)# 2. 綁定IP地址和端口號# 如果bind中的參數第一個ip地址元素設置為"",默認為本機ip地址tcp_server_socket.bind(("", 8888))# 3.設置監聽 128:代表服務端等待排隊連接的最大數量tcp_server_socket.listen(128)while True:# 4.等待接受客戶端的連接請求 accept阻塞等待 返回一個用以和客戶端通socket,客戶端的地址conn_socket, ip_port = tcp_server_socket.accept()print("客戶端地址:", ip_port)# 使用多線程去接收多個客戶端的請求 設置守護主線程sub_thread = threading.Thread(target=handle_client, args=(conn_socket,), daemon=True)sub_thread.start()tcp_server_socket.close()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/165106.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165106.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165106.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

淺談C#在unity應用中的工廠模式

文章目錄 前言簡單工廠模式工廠方法模式抽象工廠模式Unity實戰 前言 工廠模式是一種創建型設計模式,它提供了一種將對象的實例化過程封裝起來的方法,使得客戶端代碼不必直接依賴于具體類。這有助于降低代碼的耦合度,提高代碼的可維護性和可擴…

Python項目打包

Python項目如何打包? 本指南總結了Python項目打包的最佳實踐,主要涉及代碼的打包和分發,以及環境和依賴的管理。 0. 一般項目清單 源代碼(可使用git托管)數據包(可使用DVC托管)Docker環境鏡像…

Python進行threading多線程編程及高級并發處理機制

threading 模塊是 Python 中用于進行多線程編程的標準庫之一。通過 threading 模塊,你可以創建和管理線程,使得程序能夠并發執行多個任務。以下是一些基本的 threading 模塊的用法: 1. 創建線程: 使用 threading.Thread 類可以創…

在兩個java項目中實現Redis的發布訂閱模式

如何在兩個java項目中實現Redis的發布訂閱模式? 1. Redis簡介2. 發布訂閱模式介紹3. 實現思路4. 代碼實現及詳細解釋4.1. RedisUtil4.2. Publisher4.3. Subscriber4.4. 運行程序 目錄: Redis簡介發布訂閱模式介紹實現思路代碼實現及詳細解釋 1. Redis簡…

HTB Napper WriteUp

Napper 2023年11月12日 14:58:35User Nmap ? Napper nmap -sCV -A -p- 10.10.11.240 --min-rate 10000 Starting Nmap 7.80 ( https://nmap.org ) at 2023-11-12 13:58 CST Nmap scan report for app.napper.htb (10.10.11.240) Host is up (0.15s latency). Not shown: …

gitee推薦-SAPI++

一下內容來自gitee。 SaaS-Apps-Engine: 智者|SAPI是多應用、多租戶SaaS應用引擎,支持(小程序/公眾號/輕應用/企微/抖音/支付寶/百度)等多平臺應用。基于ThinkPHP6.1/8.0原生多應用模式開發,簡潔、高效、易擴展。集成強大的權限控…

適用于電腦的5個免費文件恢復軟件分享

適用于電腦的最佳免費文件恢復軟件 任何計算機用戶都可能經歷過丟失重要文件的恐懼。重要數據的丟失可能會令人不安和沮喪,無論是由于不小心刪除、計算機故障還是硬盤格式化造成的。幸運的是,在數字時代,您可以使用值得信賴的解決方案檢索這些…

好工具|datamap,一個好用的地圖可視化Excel插件,在Excel中實現地理編碼、拾取坐標

在做VRP相關研究的時候,需要對地圖數據做很多處理,比如地理編碼,根據“重慶市沙坪壩區沙正街174號”這樣的一個文本地址知道他的經緯度;再比如繪制一些散點圖,根據某個位置的經緯度在地圖上把它標注出來。還有有的時候…

vue + docxtemplater 導出 word 文檔

一、痛點 word 導出 這種功能其實之前都是后端實現的,但最近有個項目沒得后端。所以研究下前端導出。 ps: 前端還可以導出 pdf,但是其分頁問題需要話精力去計算才可能實現,并且都不是很完善。可參考之前的文章:利用 h…

MIT6.824-Raft筆記:腦裂、Majority Vote(過半投票/過半選舉)

本部分主要是問題引入,以及給出一個解決方案 1 腦裂(Split Brain) replication system的共同點:單點 前面幾個容錯特性(fault-tolerant)的系統,有一個共同的特點。 MapReduce復制了計算&…

JavaScript框架 Angular、React、Vue.js 的全棧解決方案比較

在 Web 開發領域,JavaScript 提供大量技術棧可供選擇。其中最典型的三套組合,分別是 MERN、MEAN 和 MEVN。前端框架(React、Angular 和 Vue)進行簡化比較。 MERN 技術棧詳解 MERN 技術棧包含四大具體組件: MongoDB&am…

藍橋杯物聯網競賽_STM32L071_3_Oled顯示

地位: 對于任何一門編程語言的學習,print函數毫無疑問是一種最好的調試手段,調試者不僅能通過它獲取程序變量的運行狀態而且通過對其合理使用獲取程序的運行流程,更能通過關鍵變量的輸出幫你驗證推理的正確與否,樸素的…

常見網絡安全防護

1 阻斷服務攻擊(DOS) 阻斷服務攻擊,想辦法目標網絡資源用盡變種:分布式阻斷服務攻擊 影響: 寬帶消耗性(消耗目標的帶寬)資源消耗型(消耗目標的計算資源) 解決方案&am…

人工智能對網絡安全的影響越來越大

如果問當前IT行業最熱門的話題是什么,很少有人會回答除了人工智能(AI)之外的任何話題。 在不到 12 個月的時間里,人工智能已經從一項只有 IT 專業人員才能理解的技術發展成為從小學生到作家、程序員和藝術家的每個人都使用的工具…

MySQL索引事務基礎

目錄 1. 索引 1.1索引的概念 1.2索引的特點 1.3 索引的使用場景 1.4索引的使用 1.4.1查看索引 1.4.2創建索引 1.4.3刪除索引 1.5索引保存的數據結構 2.事務 2.1經典例子 2.2事務的概念 2.3事務的使用 2.4事務的4個核心特性 2.5事務的并發問題 2.5.1臟讀 2.5.2不可…

Python + Docker 還是 Rust + WebAssembly?

在不斷發展的技術世界中,由大語言模型驅動的應用程序,通常被稱為“LLM 應用”,已成為各種行業技術創新背后的驅動力。隨著這些應用程序的普及,用戶需求的大量涌入對底層基礎設施的性能、安全性和可靠性提出了新的挑戰。 Python 和…

Java項目如何打包成Jar(最簡單)

最簡單的辦法,使用Maven插件(idea自帶) 1.選擇需要打包的mudule,點擊idea右側的maven插件 2.clean操作 3.選擇需要的其他mudule,進行install操作(如果有) 4.再次選擇需要打包的module&#…

Vue.observable 是什么

Observable 翻譯過來我們可以理解成可觀察的 Vue.js2.6 新增 Vue.observable,讓一個對象變成響應式數據。Vue 內部會用它來處理 data 函數返回的對象 。 返回的對象可以直接用于渲染函數和計算屬性內,并且會在發生變更時觸發相應的更新。也可以作為最小化…

Git的指令

Git 各平臺安裝包下載地址為:http://git-scm.com/downloads Ubuntu Git 安裝命令為: $ apt-get install git用戶信息 配置個人的用戶名稱和電子郵件地址: $ git config --global user.name "runoob" $ git config --global user.…

Python----類對象和實例對象

目錄 一.類和類的實例 二.類屬性和實例屬性 三.私有屬性和公有屬性 四.靜態方法和類方法 五.__init__方法,__new__方法和__del__方法: 六.私有方法和公有方法 七.方法的重載 八.方法的繼承 九.方法的重寫 十.對象的特殊方法 十一.對象的引用&a…