Python - Socket Programming
您好,未來的 Python 巫師們!今天,我們將深入探索 Socket 编程的精彩世界。如果你是個新手,別擔心;我們會從最基本的知識開始,然後逐步提升。在這個教學結束時,你將能夠像專業人士一樣創建自己的網絡應用程序!
什麼是 Sockets?
想像一下,你試圖與遠方的朋友通話。你需要一種方式來發送你的訊息並接收他們的回覆。在計算機的世界裡,Sockets 扮演這樣的角色。它們就像電話線,讓計算機能夠在網絡上相互通信。
Sockets 是運行在網絡上的兩個程序之間雙向通信鏈路的終點。它們是客户端(如你的網頁瀏覽器)與服務器(如一個網站)之間傳送訊息的方式。
The Python socket 模組
Python 為我們提供了一個內置的 socket
模組,讓 Socket 编程變得非常簡單。我們先從導入它開始:
import socket
這個簡單的語句為我們提供了所需的全部 Socket 功能。這就像在我們開始建造之前打開我們的工具箱!
服務器 Socket 方法
當我們創建一個服務器時,我們需要使用特定的方法來設置它。以下是最常見的服務器 Socket 方法表格:
方法 | 描述 |
---|---|
socket() |
創建一個新的 Socket |
bind() |
將 Socket 綁定到特定的地址和端口 |
listen() |
將服務器置於聆聽模式 |
accept() |
接受來自客户端的連接 |
讓我們通過一個簡單的例子來看看這些方法是如何工作的:
import socket
# 創建一個 Socket 對象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 將 Socket 綁定到特定的地址和端口
server_socket.bind(('localhost', 12345))
# 聆聽進來的連接
server_socket.listen(1)
print("服務器正在聆聽...")
# 接受一個連接
client_socket, address = server_socket.accept()
print(f"來自 {address} 的連接已經建立!")
# 關閉連接
client_socket.close()
在這個例子中,我們創建了一個 Socket,將其綁定到 'localhost' 的 12345 端口,開始聆聽,然後等待客戶端連接。當一個連接建立時,我們打印一條消息,然後關閉連接。
客户端 Socket 方法
現在,讓我們看看客户端的事情。在創建客戶端時,我們主要使用以下方法:
方法 | 描述 |
---|---|
socket() |
創建一個新的 Socket |
connect() |
連接到遠程 Socket 的指定地址 |
send() |
將數據發送到已連接的 Socket |
recv() |
從已連接的 Socket 接收數據 |
以下是一個簡單的客戶端例子:
import socket
# 創建一個 Socket 對象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 連接到服務器
client_socket.connect(('localhost', 12345))
print("已連接到服務器!")
# 關閉連接
client_socket.close()
這個客戶端創建了一個 Socket,連接到我們的服務器(應該正在運行),然後關閉連接。
Python - Socket Server
讓我們擴展我們的服務器例子,讓它真正做一些有用的事情:
import socket
def start_server():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 12345))
server_socket.listen(1)
print("服務器正在聆聽...")
while True:
client_socket, address = server_socket.accept()
print(f"來自 {address} 的連接已經建立!")
message = "歡迎來到服務器!"
client_socket.send(message.encode())
client_socket.close()
start_server()
這個服務器會繼續運行,接受連接,發送一條歡迎訊息,然後關閉連接。
Python - Socket Client
現在,讓我們創建一個能夠接收服務器訊息的客戶端:
import socket
def start_client():
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 12345))
message = client_socket.recv(1024).decode()
print(f"來自服務器的訊息:{message}")
client_socket.close()
start_client()
這個客戶端連接到我們的服務器,接收歡迎訊息,打印出來,然後關閉連接。
Python 使用 Socket 模組進行文件傳輸
Socket 编程的一個實際應用是文件傳輸。以下是一個簡單的例子,說明如何從客戶端向服務器傳送文件:
服務器端:
import socket
def receive_file():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 12345))
server_socket.listen(1)
print("服務器正在等待文件...")
client_socket, address = server_socket.accept()
print(f"來自 {address} 的連接已經建立!")
with open('received_file.txt', 'wb') as file:
while True:
data = client_socket.recv(1024)
if not data:
break
file.write(data)
print("文件已經成功接收!")
client_socket.close()
receive_file()
客戶端:
import socket
def send_file():
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 12345))
with open('file_to_send.txt', 'rb') as file:
data = file.read(1024)
while data:
client_socket.send(data)
data = file.read(1024)
print("文件已經成功傳送!")
client_socket.close()
send_file()
這個例子展示了如何使用 Sockets 從客戶端向服務器傳送文件。
The Python socketserver 模組
對於更複雜的服務器應用程序,Python 提供了 socketserver
模組。這個模組簡化了編寫網絡服務器的過程。以下是一個簡單的例子:
import socketserver
class MyTCPHandler(socketserver.BaseRequestHandler):
def handle(self):
self.data = self.request.recv(1024).strip()
print(f"接收到的訊息:{self.data.decode()}")
self.request.sendall("訊息已接收".encode())
if __name__ == "__main__":
HOST, PORT = "localhost", 9999
with socketserver.TCPServer((HOST, PORT), MyTCPHandler) as server:
print("服務器正在運行...")
server.serve_forever()
這個服務器使用 socketserver
模組創建一個 TCP 服務器,它會將接收到的任何訊息發送回來。
以上就是 Python 中 Socket 编程的基本知識,從創建簡單的客戶端和服務器到傳送文件以及使用 socketserver
模組。記住,熟能生巧,所以不要害怕嘗試這些概念。祝您編程愉快!
Credits: Image by storyset