學python網絡編程的關鍵在于理解網絡通信的基本邏輯和常用方法。要讓兩個程序通過網絡“說話”,首先要掌握socket通信,它是python網絡編程的基礎。服務端需監聽ip和端口,客戶端連接后即可傳輸數據。其次,要分清tcp和udp的區別:1. tcp是可靠的、面向連接的協議,適合傳文字等對可靠性要求高的場景;2. udp無連接,速度快但不保證送達,適合實時音視頻傳輸。最后,實現多任務處理以避免程序卡住,常見方式包括:3. 使用線程(threading)處理多個客戶端連接;4. 使用異步io(asyncio)高效管理大量輕量級任務;5. 多進程(multiprocessing)適用于cpu密集型任務。初學者應先實現基本通信,再逐步優化性能。
學Python網絡編程,重點不在語法多復雜,而是理解網絡通信的基本邏輯和常用方法。如果你剛接觸這個領域,可能最想知道的是:怎么讓兩個程序通過網絡“說話”?用什么方式更簡單有效?下面我們就從幾個關鍵點入手,講講入門時必須掌握的內容。
1. 理解Socket通信是基礎
所有Python網絡通信幾乎都繞不開 Socket(套接字)。你可以把它想象成兩個程序之間的“電話線”,一端發送,另一端接收。
- 服務端要先“監聽”某個IP和端口
- 客戶端再“連接”過去,建立連接后就可以傳數據了
# 簡單的服務端示例 import socket s = socket.socket() s.bind(('0.0.0.0', 8888)) s.listen(1) print("等待連接...") conn, addr = s.accept() print("來自", addr, "的連接") data = conn.recv(1024) print("收到數據:", data.decode())
客戶端就更簡單了:
立即學習“Python免費學習筆記(深入)”;
# 客戶端發送一條消息 import socket s = socket.socket() s.connect(('127.0.0.1', 8888)) s.send(b"Hello from client")
注意:
- send 發送的是 bytes 類型,記得 encode
- recv 接收的數據也要 decode 才能變成字符串
- 如果你卡在 recv 這一步,大概率是沒收到數據或連接沒建立成功
2. TCP 和 UDP 的區別要搞清楚
初學者容易混淆這兩個協議。它們都是傳輸數據的方式,但適用場景不同。
- TCP 是可靠的、面向連接的協議。就像打電話,說一句對方聽一句,不會丟信息。
- UDP 是無連接的,速度快但不保證送達。適合視頻、游戲這種對實時性要求高、偶爾丟包也沒關系的場景。
舉個例子:
- 聊天軟件發文字?用TCP穩妥
- 實時音視頻傳輸?通常選UDP,丟幾幀沒關系,延遲不能大
Python中使用UDP也很簡單:
# UDP服務端接收 import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.bind(('0.0.0.0', 9999)) data, addr = s.recvfrom(1024) print("收到UDP數據:", data.decode())
客戶端:
# UDP客戶端發送 import socket s = socket.socket(socket.SOCK_DGRAM) s.sendto(b"Hello via UDP", ("127.0.0.1", 9999))
3. 多任務處理:別讓你的程序卡住
如果你寫了個服務器,只能同時處理一個客戶端,那顯然不夠用。怎么辦?可以用以下幾種方式實現“并發”。
常見做法包括:
- 每來一個連接就開一個新線程(threading)
- 使用異步IO(asyncio)——適合大量輕量級任務
- 多進程(multiprocessing)——適合CPU密集型任務
比如用線程實現多客戶端支持:
import socket import threading def handle_client(conn): data = conn.recv(1024) print("收到:", data.decode()) conn.close() s = socket.socket() s.bind(('0.0.0.0', 8888)) s.listen(5) while True: conn, addr = s.accept() t = threading.Thread(target=handle_client, args=(conn,)) t.start()
這種方式雖然簡單,但線程太多會帶來資源壓力。如果是做爬蟲、聊天機器人這類任務,可以考慮用 asyncio 更高效地管理連接。
基本上就這些。剛入門的時候不用追求寫出高性能服務器,先把連接建立起來、把數據傳通是最重要的。等熟悉了基本流程,再慢慢優化效率也不遲。