文章目錄
- 1.套接字(Socket)
- 1.1 概念
- 1.2 類型
- 1.3 使用步驟
Python 的網絡編程主要用于讓不同的計算機或者程序之間進行數據交換和通信,就好像人與人之間打電話、發消息一樣。
下面從幾個關鍵方面通俗易懂地介紹一下:
1.套接字(Socket)
在 Python 網絡編程里,套接字(Socket)是個很重要的概念。
你可以把它想象成電話,有了它,不同的程序之間才能建立連接、交換數據。在 Python 里,socket 模塊提供了創建套接字的功能。
1.1 概念
你可以把套接字想象成是兩部電話,每部電話都有一個獨一無二的號碼,通過這個號碼就能和對方建立聯系。在網絡里,套接字就是程序的 “電話號碼”,它代表了網絡中某個程序的具體位置。
每個套接字都有一個對應的 IP 地址和端口號,IP 地址就像城市和街道的地址,而端口號則像是具體的門牌號,有了這兩個信息,數據就能準確地發送到目標程序
1.2 類型
在 Python 網絡編程中,有兩種常見的套接字類型:
-
TCP 套接字(SOCK_STREAM):TCP(傳輸控制協議)套接字就像打電話,在數據傳輸前需要先建立連接,確保數據能可靠、有序地到達對方。一旦連接建立,通信雙方就可以持續穩定地交換數據。它適用于對數據準確性要求較高的場景,比如網頁瀏覽、文件傳輸等。
-
UDP 套接字(SOCK_DGRAM):UDP(用戶數據報協議)套接字如同發消息,無需提前建立連接,直接把數據發送出去就行。不過,它不能保證數據一定能到達對方,也無法保證數據的順序。但它的優點是傳輸速度快,常用于對實時性要求較高、對數據準確性要求相對較低的場景,像視頻會議、在線游戲等。
1.3 使用步驟
- TCP 套接字使用步驟
-
服務器端
- 創建套接字:借助 socket.socket() 函數創建一個 TCP 套接字。
- 綁定地址和端口:使用 bind() 方法把套接字和特定的 IP 地址、端口號綁定在一起。
- 監聽連接:調用 listen() 方法讓套接字開始監聽客戶端的連接請求。
- 接受連接:使用 accept() 方法接受客戶端的連接請求,并且返回一個新的套接字對象和客戶端的地址。
- 收發數據:利用新的套接字對象通過 send() 或 sendall() 方法發送數據,使用 recv() 方法接收數據。
- 關閉連接:通信結束后,使用 close() 方法關閉套接字。
-
客戶端
- 創建套接字:同樣使用 socket.socket() 函數創建一個 TCP 套接字。
- 連接服務器:調用 connect() 方法連接到服務器的指定 IP 地址和端口號。
- 收發數據:通過 send() 或 sendall() 方法發送數據,使用 recv() 方法接收數據。
- 關閉連接:通信結束后,使用 close() 方法關閉套接字。
以下是簡單的 TCP 套接字示例代碼:
服務端:
# 服務器端代碼
import socket# 創建TCP套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 綁定地址和端口
server_address = ('localhost', 8888)
server_socket.bind(server_address)# 開始監聽
server_socket.listen(1)print('服務器正在監聽端口 8888...')while True:# 接受客戶端連接connection, client_address = server_socket.accept()try:print(f'連接來自: {client_address}')# 接收數據data = connection.recv(1024)print(f'收到的數據: {data.decode()}')# 發送響應message = '你好,客戶端!'connection.sendall(message.encode())finally:# 關閉連接connection.close()
客戶端代碼:
# 客戶端代碼
import socket# 創建TCP套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 服務器地址和端口
server_address = ('localhost', 8888)# 連接服務器
client_socket.connect(server_address)try:# 發送數據message = '你好,服務器!'client_socket.sendall(message.encode())# 接收響應data = client_socket.recv(1024)print(f'收到服務器的響應: {data.decode()}')
finally:# 關閉連接client_socket.close()
- UDP 套接字使用步驟
-
服務器端
- 創建套接字:使用 socket.socket() 函數創建一個 UDP 套接字。
- 綁定地址和端口:通過 bind() 方法把套接字和特定的 IP 地址、端口號綁定在一起。
- 收發數據:使用 sendto() 方法發送數據,使用 recvfrom() 方法接收數據。
- 關閉套接字:通信結束后,使用 close() 方法關閉套接字。
-
客戶端
- 創建套接字:使用 socket.socket() 函數創建一個 UDP 套接字。
- 收發數據:使用 sendto() 方法發送數據,使用 recvfrom() 方法接收數據。
- 關閉套接字:通信結束后,使用 close() 方法關閉套接字。
以下是簡單的 UDP 套接字示例代碼:
服務器端代碼
# 服務器端代碼
import socket# 創建UDP套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 綁定地址和端口
server_address = ('localhost', 9999)
server_socket.bind(server_address)print('服務器正在監聽端口 9999...')while True:# 接收數據data, client_address = server_socket.recvfrom(1024)print(f'收到來自 {client_address} 的數據: {data.decode()}')# 發送響應message = '你好,客戶端!'server_socket.sendto(message.encode(), client_address)
客戶端代碼
# 客戶端代碼
import socket# 創建UDP套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 服務器地址和端口
server_address = ('localhost', 9999)# 發送數據
message = '你好,服務器!'
client_socket.sendto(message.encode(), server_address)# 接收響應
data, server = client_socket.recvfrom(1024)
print(f'收到服務器的響應: {data.decode()}')# 關閉套接字
client_socket.close()
套接字是 Python 網絡編程的基礎,理解它的概念、類型和使用方法,能幫助你實現不同程序之間的網絡通信