Python網絡與多任務編程:TCP/UDP實戰指南

Python網絡與多任務編程:TCP/UDP實戰指南

一、網絡編程

1.1 前言

網絡編程是現代軟件開發中不可或缺的一部分,它使得不同設備之間的數據交換成為可能。Python提供了強大的標準庫來支持各種網絡編程需求。

1.1.1 IP地址簡介

IP地址是互聯網上設備的唯一標識符,分為IPv4和IPv6兩種格式:

import socket# 獲取本機IP地址
hostname = socket.gethostname()
ip_address = socket.gethostbyname(hostname)
print(f"主機名: {hostname}")
print(f"IP地址: {ip_address}")# 域名解析
domain = "www.google.com"
try:ip = socket.gethostbyname(domain)print(f"{domain} 的IP地址是: {ip}")
except socket.gaierror:print(f"無法解析域名: {domain}")
1.1.2 端口和端口號簡介

端口是網絡通信的端點,端口號范圍是0-65535,其中0-1023為知名端口,一般由系統服務使用。

# 常見端口號示例
common_ports = {"HTTP": 80,"HTTPS": 443,"FTP": 21,"SSH": 22,"SMTP": 25,"DNS": 53
}print("常見服務端口號:")
for service, port in common_ports.items():print(f"{service}: {port}")
1.1.3 字符串數據編解碼

網絡傳輸中數據需要以字節形式傳輸,因此需要進行編解碼操作:

# 字符串編碼與解碼
text = "你好,世界!"# 編碼為字節
encoded_data = text.encode('utf-8')
print(f"編碼后: {encoded_data}")# 解碼為字符串
decoded_text = encoded_data.decode('utf-8')
print(f"解碼后: {decoded_text}")# 其他編碼方式
text_gbk = text.encode('gbk')
print(f"GBK編碼: {text_gbk}")

1.2 TCP

1.2.1 TCP介紹

TCP(傳輸控制協議)是一種面向連接的、可靠的、基于字節流的傳輸層通信協議。它提供全雙工通信,確保數據順序傳輸且不丟失。

1.2.2 TCP客戶端開發
1.2.2.1 發送數據
import socketdef tcp_client_send(host='127.0.0.1', port=8888):"""TCP客戶端發送數據"""# 創建TCP socketclient_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)try:# 連接服務器client_socket.connect((host, port))print(f"已連接到服務器 {host}:{port}")# 發送數據message = "Hello, TCP Server!"client_socket.send(message.encode('utf-8'))print(f"已發送: {message}")except Exception as e:print(f"連接錯誤: {e}")finally:# 關閉連接client_socket.close()print("連接已關閉")if __name__ == "__main__":tcp_client_send()
1.2.2.2 發送并接收數據
def tcp_client_send_receive(host='127.0.0.1', port=8888):"""TCP客戶端發送并接收數據"""client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)try:client_socket.connect((host, port))print(f"已連接到服務器 {host}:{port}")# 發送數據message = "Hello, Server! How are you?"client_socket.send(message.encode('utf-8'))print(f"已發送: {message}")# 接收響應response = client_socket.recv(1024).decode('utf-8')print(f"收到響應: {response}")except Exception as e:print(f"錯誤: {e}")finally:client_socket.close()print("連接已關閉")if __name__ == "__main__":tcp_client_send_receive()
1.2.3 TCP服務器開發
1.2.3.1 接收客戶端消息并回復
def tcp_server_simple(host='127.0.0.1', port=8888):"""簡單的TCP服務器,接收消息并回復"""# 創建TCP socketserver_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 設置地址重用server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# 綁定地址和端口server_socket.bind((host, port))# 開始監聽,設置最大連接數server_socket.listen(5)print(f"服務器啟動,監聽 {host}:{port}")try:while True:# 接受客戶端連接client_socket, client_address = server_socket.accept()print(f"接收到來自 {client_address} 的連接")try:# 接收客戶端數據data = client_socket.recv(1024).decode('utf-8')if data:print(f"收到消息: {data}")# 回復客戶端response = f"服務器已收到你的消息: {data}"client_socket.send(response.encode('utf-8'))except Exception as e:print(f"處理客戶端數據時出錯: {e}")finally:# 關閉客戶端連接client_socket.close()print(f"與 {client_address} 的連接已關閉")except KeyboardInterrupt:print("服務器被用戶中斷")finally:# 關閉服務器socketserver_socket.close()print("服務器已關閉")if __name__ == "__main__":tcp_server_simple()
1.2.3.2 接收客戶端的多條信息
def tcp_server_multiple_messages(host='127.0.0.1', port=8888):"""處理客戶端多條消息的TCP服務器"""server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)server_socket.bind((host, port))server_socket.listen(5)print(f"服務器啟動,監聽 {host}:{port}")try:while True:client_socket, client_address = server_socket.accept()print(f"接收到來自 {client_address} 的連接")try:# 持續接收客戶端消息while True:data = client_socket.recv(1024).decode('utf-8')if not data:print(f"{client_address} 斷開連接")breakprint(f"收到來自 {client_address} 的消息: {data}")# 處理特殊命令if data.lower() == 'exit':response = "再見!"client_socket.send(response.encode('utf-8'))breakelif data.lower() == 'time':from datetime import datetimeresponse = f"當前時間: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"client_socket.send(response.encode('utf-8'))else:response = f"已收到: {data}"client_socket.send(response.encode('utf-8'))except ConnectionResetError:print(f"{client_address} 異常斷開連接")except Exception as e:print(f"處理 {client_address} 時出錯: {e}")finally:client_socket.close()except KeyboardInterrupt:print("服務器被用戶中斷")finally:server_socket.close()print("服務器已關閉")if __name__ == "__main__":tcp_server_multiple_messages()
1.2.3.3 允許客戶端多次連接
import threadingdef handle_client(client_socket, client_address):"""處理客戶端連接的線程函數"""print(f"開始處理 {client_address} 的連接")try:while True:data = client_socket.recv(1024).decode('utf-8')if not data:print(f"{client_address} 斷開連接")breakprint(f"收到來自 {client_address} 的消息: {data}")# 回復客戶端response = f"服務器已收到: {data}"client_socket.send(response.encode('utf-8'))except ConnectionResetError:print(f"{client_address} 異常斷開連接")except Exception as e:print(f"處理 {client_address} 時出錯: {e}")finally:client_socket.close()print(f"{client_address} 的連接已關閉")def tcp_server_multiple_clients(host='127.0.0.1', port=8888):"""支持多客戶端連接的TCP服務器"""server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)server_socket.bind((host, port))server_socket.listen(5)print(f"服務器啟動,監聽 {host}:{port}")try:while True:client_socket, client_address = server_socket.accept()print(f"接收到來自 {client_address} 的連接")# 為每個客戶端創建新線程client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address))client_thread.daemon = Trueclient_thread.start()except KeyboardInterrupt:print("服務器被用戶中斷")finally:server_socket.close()print("服務器已關閉")if __name__ == "__main__":tcp_server_multiple_clients()
1.2.4 TCP開發總結
  1. TCP特點:面向連接、可靠傳輸、流量控制、擁塞控制
  2. 適用場景:需要可靠數據傳輸的應用,如文件傳輸、郵件、Web瀏覽
  3. 開發要點
    • 客戶端使用connect()連接服務器
    • 服務器使用bind()綁定地址,listen()監聽,accept()接受連接
    • 使用send()和recv()進行數據傳輸
    • 及時關閉連接釋放資源
    • 處理異常和連接中斷情況

1.3 UDP

1.3.1 UDP介紹

UDP(用戶數據報協議)是一種無連接的傳輸層協議,提供不可靠的數據報服務。它不保證數據順序和可靠性,但傳輸效率高。

1.3.2 UDP發送端開發
def udp_sender(host='127.0.0.1', port=9999):"""UDP發送端"""# 創建UDP socketudp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)try:while True:# 獲取用戶輸入message = input("請輸入要發送的消息 (輸入 'exit' 退出): ")if message.lower() == 'exit':break# 發送數據udp_socket.sendto(message.encode('utf-8'), (host, port))print(f"已發送到 {host}:{port}: {message}")except Exception as e:print(f"發送錯誤: {e}")finally:udp_socket.close()print("UDP發送端已關閉")if __name__ == "__main__":udp_sender()
1.3.3 UDP接收端開發
def udp_receiver(host='127.0.0.1', port=9999):"""UDP接收端"""# 創建UDP socketudp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 綁定地址和端口udp_socket.bind((host, port))print(f"UDP接收端啟動,監聽 {host}:{port}")try:while True:# 接收數據data, addr = udp_socket.recvfrom(1024)message = data.decode('utf-8')print(f"收到來自 {addr} 的消息: {message}")# 可選:發送回復if message.lower() == 'hello':reply = "Hello from UDP Receiver!"udp_socket.sendto(reply.encode('utf-8'), addr)except KeyboardInterrupt:print("接收端被用戶中斷")except Exception as e:print(f"接收錯誤: {e}")finally:udp_socket.close()print("UDP接收端已關閉")if __name__ == "__main__":udp_receiver()
1.3.4 UDP廣播
def udp_broadcast_sender(port=9999):"""UDP廣播發送端"""# 創建UDP socketudp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 設置廣播選項udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)# 廣播地址broadcast_address = '<broadcast>'try:while True:# 獲取用戶輸入message = input("請輸入廣播消息 (輸入 'exit' 退出): ")if message.lower() == 'exit':break# 發送廣播udp_socket.sendto(message.encode('utf-8'), (broadcast_address, port))print(f"已廣播: {message}")except Exception as e:print(f"廣播錯誤: {e}")finally:udp_socket.close()print("廣播發送端已關閉")def udp_broadcast_receiver(port=9999):"""UDP廣播接收端"""udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 綁定到所有接口udp_socket.bind(('', port))print(f"廣播接收端啟動,監聽端口 {port}")try:while True:data, addr = udp_socket.recvfrom(1024)message = data.decode('utf-8')print(f"收到來自 {addr} 的廣播: {message}")except KeyboardInterrupt:print("廣播接收端被用戶中斷")except Exception as e:print(f"接收錯誤: {e}")finally:udp_socket.close()print("廣播接收端已關閉")if __name__ == "__main__":# 需要在不同終端運行接收端和發送端import sysif len(sys.argv) > 1 and sys.argv[1] == 'receiver':udp_broadcast_receiver()else:udp_broadcast_sender()

二、多任務編程

多任務編程允許程序同時執行多個任務,提高程序效率和響應性。Python中主要通過多線程和多進程實現。

2.1 多線程編程

import threading
import timedef worker(name, delay):"""簡單的 worker 函數"""print(f"線程 {name} 開始執行")time.sleep(delay)print(f"線程 {name} 執行完成,延遲 {delay} 秒")# 創建多個線程
threads = []
for i in range(5):t = threading.Thread(target=worker, args=(f"Thread-{i}", i))threads.append(t)t.start()# 等待所有線程完成
for t in threads:t.join()print("所有線程執行完成")

2.2 線程同步

import threading# 使用鎖進行同步
counter = 0
lock = threading.Lock()def increment_counter():global counterfor _ in range(100000):with lock:  # 使用上下文管理器自動獲取和釋放鎖counter += 1# 創建多個線程增加計數器
threads = []
for _ in range(10):t = threading.Thread(target=increment_counter)threads.append(t)t.start()for t in threads:t.join()print(f"最終計數器值: {counter} (應為 1000000)")

2.3 多進程編程

import multiprocessing
import timedef cpu_intensive_task(n):"""CPU密集型任務"""result = 0for i in range(n):result += i * ireturn resultif __name__ == "__main__":# 創建進程池with multiprocessing.Pool(processes=4) as pool:# 并行執行任務results = pool.map(cpu_intensive_task, [10000000] * 8)print(f"計算結果: {results}")

總結

本文介紹了Python網絡編程和多任務編程的基礎知識:

  1. 網絡編程基礎:IP地址、端口和編解碼
  2. TCP編程:面向連接的可靠通信,適合需要數據完整性的場景
  3. UDP編程:無連接的快速通信,適合實時性要求高的場景
  4. 多任務編程:通過多線程和多進程提高程序效率

掌握這些知識后,你可以開發各種網絡應用,從簡單的客戶端/服務器程序到復雜的分布式系統。在實際開發中,根據需求選擇合適的協議和并發模型至關重要。

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

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

相關文章

Android8 binder源碼學習分析筆記(四)——ServiceManager啟動

前文回顧&#xff1a; Android8 binder源碼學習分析筆記&#xff08;三&#xff09;&#xff1a; https://blog.csdn.net/g_i_a_o_giao/article/details/151365630?spm1001.2014.3001.5502 Android8 binder源碼學習分析筆記&#xff08;二&#xff09;&#xff1a; https://…

Redis 大 Key 與熱 Key:生產環境的風險與解決方案

&#x1f525; Redis 大 Key 與熱 Key&#xff1a;生產環境的風險與解決方案 文章目錄&#x1f525; Redis 大 Key 與熱 Key&#xff1a;生產環境的風險與解決方案&#x1f9e0; 一、問題定義與識別&#x1f4a1; 什么是大 Key&#xff1f;&#x1f525; 什么是熱 Key&#xff…

C++算法題中的輸入輸出形式(I/O)

本文主要幫助刷leetcode題型快速適應完整帶輸入輸出的題&#xff08;機試、考試、比賽等&#xff09;接收能用cin就用cin 。cin 自動分割單詞 的特性&#xff08;cin 讀取字符串時會自動跳過空格 / 換行&#xff0c;將連續非空格字符作為一個 “單詞”&#xff09;一、單組輸入…

【左程云算法09】棧的入門題目-最小棧

目錄 棧的入門題目-最小棧 代碼演示 視頻鏈接 算法講解015【入門】棧的入門題目-最小棧 Leecode155 棧的入門題目-最小棧 實現一個getmin方法&#xff08;高效方法&#xff0c;即不用遍歷&#xff09;&#xff0c;希望能實現O&#xff08;1&#xff09; 做法&#xff1a…

Grafana與Prometheus實戰

&#x1f31f;Grafana的Dashboard的權限管理 創建團隊 創建用戶 設置團隊權限 &#x1f31f;Prometheus啟用https及認證功能 自建ca的證書 準備證書目錄 mkdir /app/tools/prometheus-2.53.4.linux-amd64/certs cd /app/tools/prometheus-2.53.4.linux-amd64/certs生成ca的…

FPGA交通燈設計報告(源碼+管腳約束+實物圖+設計報告)

基于FPGA的交通燈設計 摘要 本設計采用FPGA技術實現了一個智能交通燈控制系統。系統以Verilog HDL為設計語言,在FPGA平臺上實現了交通燈的自動控制、數碼管倒計時顯示、緊急情況處理等功能。通過合理的狀態機設計和模塊化編程,系統具有良好的實時性、可靠性和可擴展性,能夠…

技術論文分析分析論文《計算機病毒判定專家系統原理與設計》思考其在游戲中的應用

論文原文的引言主要有兩大部分的內容&#xff1a;介紹計算機病毒&#xff0c;明確本文使用的病毒分類方式&#xff1b;分析傳統計算機病毒檢測存在的弊端。對于計算機病毒的定義&#xff0c;文中給出的定義比較嚴謹&#xff0c;我自己查了一下現在百度百科的定義&#xff0c;兩…

《Unity項目實戰:動態加載引發的顯存危機全鏈路排查與重構實踐》

從動態光影那流光溢彩、仿佛賦予虛擬世界真實質感的絢麗效果—這得益于Unity引擎強大的HDRP管線對光照路徑的精準模擬,到物理引擎驅動的物體碰撞精準到毫厘的物理反饋—依托Unity Physics模塊對剛體動力學的毫秒級計算,再到能夠依據不同設備性能自動適配的畫質表現—通過Unit…

智慧水庫綜合管理系統平臺御控物聯網解決方案

一、行業背景與痛點分析水庫作為防洪、灌溉、供水、發電及生態保護的核心基礎設施&#xff0c;其管理效率直接關系到區域水資源安全與可持續發展。然而&#xff0c;傳統水庫管理模式存在四大核心痛點&#xff1a;數據孤島嚴重&#xff1a;水位、雨量、水質、設備狀態等數據分散…

使用nvm安裝Node.js18以下報錯解決方案——The system cannot find the file specified.

使用 nvm 安裝 Node.js 18以下 報錯解決方案 在前端開發過程中&#xff0c;常常需要針對不同項目切換 Node.js 版本。nvm&#xff08;Node Version Manager&#xff09;是最常用的工具。但最近在嘗試安裝 Node.js 14 版本時&#xff0c;遇到了奇怪的錯誤。 問題描述 使用 nv…

在Excel和WPS表格中快速復制上一行內容

有的時候我們在Excel和WPS表格中想復制上一行對應單元格、連續區域或整行的內容&#xff0c;只需要在當前行拖動鼠標左鍵選中相關區域&#xff0c;然后按CtrlD鍵即可將上一行對應位置的內容復制過來——需要注意的是&#xff0c;如果當前行有數據&#xff0c;這些數據會直接被覆…

408學習之c語言(遞歸與函數)

今天主要學習了遞歸與函數的相關內容&#xff0c;下面將我今天所學知識與所寫代碼分享給大家 遞歸核心要點 遞歸三要素 基準條件&#xff08;明確終止條件&#xff09; 遞歸調用&#xff08;逐步分解問題&#xff09; 收斂性&#xff08;確保每次遞歸都向基準條件靠近&#xff…

swVBA自學筆記016、Solidworks API Help 幫助文檔的(三大版塊)

目錄1. Namespace (命名空間) 版塊2. Interface (接口) 版塊3. Members (接口成員) 版塊4、總結關系5、如果你感覺上面說的過于簡單&#xff0c;請往下看!6、示例鏈接→SOLIDWORKS API Help 20197、需要注意的是&#xff0c;帶“I”的對象表示&#xff1a;接口1. Namespace (命…

通俗易懂地講解JAVA的BIO、NIO、AIO

理解Java的I/O模型&#xff08;BIO、NIO、AIO&#xff09;對于構建高性能網絡應用至關重要 &#x1f9e0; 通俗理解&#xff1a;快遞站的故事 想象一個快遞站&#xff1a; ? BIO&#xff1a;就像快遞站為每一個包裹都安排一位專員。專員從接到包裹到處理完&#xff08;簽收、…

LabVIEW 泵輪檢測系統

在汽車行業&#xff0c;泵輪作為液力變矩器關鍵部件&#xff0c;其質量檢測極為重要。傳統手工檢測泵輪效率低且誤差大&#xff0c;為此構建基于 LabVIEW 與西門子硬件結合的泵輪檢測系統。 應用場景 聚焦汽車零部件生產車間&#xff0c;對泵輪總成進行出廠前檢測。在液力變矩…

2025年8月月賽 T2 T3

一. 七天假日 T2原思路&#xff1a;直接計算左右括號的數量&#xff0c;然后直接輸出他們的差改進思路&#xff1a; 用d值記錄截止到當前位置&#xff0c;還需要多少個右括號可以滿足非法要求cur&#xff1a;截止到當前位置&#xff0c;已經有多少個右括號sum是右括號位置的前綴…

數據結構----棧的順序存儲(順序棧)

棧的特點&#xff1a;先進后出棧的操作&#xff1a;用數組進行存儲&#xff08;1&#xff09;初始化&#xff1a;//棧 typedef struct {int *data;//指針模擬分配數組int top;//棧“頂”指針 }Stack; //初始化 Stack InitStack(){Stack s;//給數組分配空間s.data (int*)malloc…

React Hooks原理深度解析與高級應用模式

React Hooks原理深度解析與高級應用模式 引言 React Hooks自16.8版本引入以來&#xff0c;徹底改變了我們編寫React組件的方式。然而&#xff0c;很多開發者僅僅停留在使用層面&#xff0c;對Hooks的實現原理和高級應用模式了解不深。本文將深入探討Hooks的工作原理、自定義Hoo…

兼職網|基于SpringBoot和Vue的蝸牛兼職網(源碼+數據庫+文檔)

項目介紹 : SpringbootMavenMybatis PlusVue Element UIMysql 開發的前后端分離的蝸牛兼職網&#xff0c;項目分為管理端和用戶端和企業端。 項目演示: 基于SpringBoot和Vue的蝸牛兼職網 運行環境: 最好是java jdk 1.8&#xff0c;我們在這個平臺上運行的。其他版本理論上也可…

TDengine 聚合函數 LEASTSQUARES 用戶手冊

LEASTSQUARES 函數用戶手冊 函數定義 LEASTSQUARES(expr, start_val, step_val)功能說明 LEASTSQUARES() 函數對指定列的數據進行最小二乘法線性擬合&#xff0c;返回擬合直線的斜率&#xff08;slope&#xff09;和截距&#xff08;intercept&#xff09;。該函數基于線性回…