python中socket(套接字)庫詳細(xì)舉例解析
1. 前言
在 Python 開發(fā)中,socket 庫是一個非常重要的工具,它允許我們進(jìn)行網(wǎng)絡(luò)編程。通過 socket,程序可以在不同的機器之間進(jìn)行通信,這為我們構(gòu)建分布式系統(tǒng)、網(wǎng)絡(luò)服務(wù)等提供了基礎(chǔ)。無論是開發(fā)一個簡單的聊天程序,還是構(gòu)建復(fù)雜的網(wǎng)絡(luò)服務(wù)架構(gòu),socket 都是不可或缺的。本文將結(jié)合詳細(xì)的 Python 代碼,全面介紹 socket 庫的使用方法,讓你輕松掌握網(wǎng)絡(luò)編程的核心技能。
2. socket 庫基礎(chǔ)
2.1 什么是 socket?
socket(套接字)是通信的端點,它是一個通信會話的抽象。在計算機網(wǎng)絡(luò)中,兩臺計算機之間要進(jìn)行通信,就需要在雙方建立 socket 連接,通過這個雙向通道進(jìn)行數(shù)據(jù)的發(fā)送和接收。
2.2 socket 的類型
主要有兩種常見的 socket 類型:
SOCK_STREAM :提供面向連接的、可靠的字節(jié)流服務(wù),基于 TCP 協(xié)議。它確保數(shù)據(jù)按照順序到達(dá),并且在數(shù)據(jù)傳輸過程中不會出現(xiàn)重復(fù)。
SOCK_DGRAM :提供無連接的、不可靠的 datagram 服務(wù),基于 UDP 協(xié)議。這種類型的數(shù)據(jù)傳輸不保證可靠性,數(shù)據(jù)可能會丟失或亂序到達(dá),但它的傳輸速度相對較快,適用于對實時性要求較高但對數(shù)據(jù)丟失不太敏感的場景,如視頻流傳輸。
3. 基于 TCP 的 socket 編程
3.1 TCP 服務(wù)器端代碼示例
import socket
# 創(chuàng)建 socket 對象,AF_INET 表示使用 IPv4 地址,SOCK_STREAM 表示使用 TCP 協(xié)議
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 綁定 IP 地址和端口,這里綁定本地主機的 8080 端口
server_socket.bind(("localhost", 8080))
# 開始監(jiān)聽,監(jiān)聽隊列長度為 5
server_socket.listen(5)
print("服務(wù)器開始監(jiān)聽...")
# 接受客戶端連接,accept() 方法會阻塞等待客戶端連接
client_socket, client_address = server_socket.accept()
print(f"客戶端 {client_address} 已連接")
# 接收客戶端發(fā)送的數(shù)據(jù),1024 表示緩沖區(qū)大小
data = client_socket.recv(1024).decode()
print(f"接收到客戶端消息:{data}")
# 向客戶端發(fā)送數(shù)據(jù)
response = "服務(wù)器已收到消息"
client_socket.send(response.encode())
# 關(guān)閉連接
client_socket.close()
server_socket.close()3.2 TCP 客戶端代碼示例
import socket
# 創(chuàng)建 socket 對象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 連接到服務(wù)器,這里連接本地主機的 8080 端口
client_socket.connect(("localhost", 8080))
# 向服務(wù)器發(fā)送數(shù)據(jù)
message = "Hello, Server!"
client_socket.send(message.encode())
# 接收服務(wù)器返回的數(shù)據(jù)
response = client_socket.recv(1024).decode()
print(f"收到服務(wù)器回復(fù):{response}")
# 關(guān)閉連接
client_socket.close()3.3 代碼分析
在服務(wù)器端,
bind()方法用于綁定 IP 地址和端口,使得服務(wù)器能夠監(jiān)聽指定地址和端口上的連接請求。listen()方法則讓服務(wù)器進(jìn)入監(jiān)聽狀態(tài),等待客戶端的連接。accept()方法是一個阻塞方法,它會等待客戶端的連接。當(dāng)客戶端連接成功后,會返回一個新的 socket 對象(用于和客戶端進(jìn)行通信)和客戶端的地址信息。客戶端通過
connect()方法連接到服務(wù)器的指定 IP 地址和端口。數(shù)據(jù)的發(fā)送和接收分別通過
send()和recv()方法實現(xiàn),需要注意數(shù)據(jù)是以字節(jié)流的形式傳輸,所以在發(fā)送之前要使用encode()方法將字符串編碼為字節(jié),接收后使用decode()方法解碼為字符串。
4. 基于 UDP 的 socket 編程
4.1 UDP 服務(wù)器端代碼示例
import socket
# 創(chuàng)建 socket 對象,SOCK_DGRAM 表示使用 UDP 協(xié)議
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 綁定 IP 地址和端口
server_socket.bind(("localhost", 9090))
print("UDP 服務(wù)器啟動,等待客戶端消息...")
while True:
# 接收客戶端發(fā)送的數(shù)據(jù)和客戶端地址
data, client_address = server_socket.recvfrom(1024)
print(f"收到客戶端 {client_address} 的消息:{data.decode()}")
# 向客戶端發(fā)送數(shù)據(jù)
response = "服務(wù)器已收到你的 UDP 消息"
server_socket.sendto(response.encode(), client_address)
# 如果收到特定消息就退出循環(huán)
if data.decode() == "exit":
break
# 關(guān)閉 socket
server_socket.close()4.2 UDP 客戶端代碼示例
import socket
# 創(chuàng)建 socket 對象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 向服務(wù)器發(fā)送數(shù)據(jù)
server_address = ("localhost", 9090)
message = "Hello, UDP Server!"
client_socket.sendto(message.encode(), server_address)
# 接收服務(wù)器返回的數(shù)據(jù)
response, server_address = client_socket.recvfrom(1024)
print(f"收到服務(wù)器 {server_address} 的回復(fù):{response.decode()}")
# 再次發(fā)送消息并接收回復(fù)(測試多輪通信)
message = "This is another message"
client_socket.sendto(message.encode(), server_address)
response, server_address = client_socket.recvfrom(1024)
print(f"收到服務(wù)器回復(fù):{response.decode()}")
# 發(fā)送退出消息
client_socket.sendto("exit".encode(), server_address)
# 關(guān)閉連接
client_socket.close()4.3 代碼分析
UDP 是無連接的,所以在服務(wù)器端不需要像 TCP 一樣調(diào)用
listen()和accept()方法來建立連接,而是直接通過recvfrom()方法接收數(shù)據(jù)和客戶端地址。客戶端通過
sendto()方法發(fā)送數(shù)據(jù),同時指定目標(biāo)服務(wù)器的地址和端口。recvfrom()方法用于接收數(shù)據(jù)和服務(wù)器的地址。UDP 的這種通信方式使得數(shù)據(jù)的發(fā)送和接收相對簡單,但需要注意數(shù)據(jù)的丟失和亂序問題。
5. 總結(jié)
Python 中的 socket 庫是強大而靈活的網(wǎng)絡(luò)編程工具。通過本文的介紹和代碼示例,我們詳細(xì)了解了基于 TCP 和 UDP 協(xié)議的 socket 編程方法。TCP 提供了可靠的面向連接的通信,適用于對數(shù)據(jù)準(zhǔn)確性要求高的場景;UDP 則提供了簡單的無連接通信,適合對實時性要求較高但對數(shù)據(jù)丟失不太敏感的場景。在實際開發(fā)中,我們可以根據(jù)具體需求選擇合適的協(xié)議類型來構(gòu)建網(wǎng)絡(luò)應(yīng)用,從簡單的客戶端 - 服務(wù)器架構(gòu)到復(fù)雜的分布式系統(tǒng),socket 庫都能為我們提供堅實的基礎(chǔ)。掌握 socket 編程,將為你打開網(wǎng)絡(luò)編程世界的大門,讓你能夠開發(fā)出各種具有網(wǎng)絡(luò)通信功能的應(yīng)用程序。
到此這篇關(guān)于python中socket(套接字)庫的文章就介紹到這了,更多相關(guān)python中socket套接字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python3中利用filter函數(shù)輸出小于某個數(shù)的所有回文數(shù)實例
今天小編就為大家分享一篇 python3中利用filter函數(shù)輸出小于某個數(shù)的所有回文數(shù)實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11
python中sub-pub機制實現(xiàn)Redis的訂閱與發(fā)布
本文主要介紹了python中sub-pub機制實現(xiàn)Redis的訂閱與發(fā)布,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
Numpy中的ravel_multi_index函數(shù)用法說明
這篇文章主要介紹了Numpy中的ravel_multi_index函數(shù)用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05
Python打包成exe(windows)或者app(mac)實踐
文章主要介紹了使用pyinstaller將Python腳本打包成可執(zhí)行文件的步驟,包括在Windows和macOS上的操作方法,詳細(xì)解釋了命令參數(shù)的作用和使用方法2026-04-04
深入探究PyTorch核心特性之自動求導(dǎo)和優(yōu)化
在你已經(jīng)掌握了如何使用PyTorch構(gòu)建神經(jīng)網(wǎng)絡(luò)的基礎(chǔ)上,接下來我們將深入探討PyTorch的兩個核心特性:自動求導(dǎo)(Autograd)和優(yōu)化(Optimization),這兩個特性在深度學(xué)習(xí)模型的訓(xùn)練過程中起著至關(guān)重要的作用,感興趣的同學(xué)一起來看看吧2023-07-07
基于Python實現(xiàn)一個自動關(guān)機程序并打包成exe文件
這篇文章主要介紹了通過Python創(chuàng)建一個可以自動關(guān)機的小程序,并打包成exe文件。文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Python有一定的幫助,感興趣的同學(xué)可以了解一下2021-12-12

