Python - Socket Programming

您好,未來的 Python 巫師們!今天,我們將深入探索 Socket 编程的精彩世界。如果你是個新手,別擔心;我們會從最基本的知識開始,然後逐步提升。在這個教學結束時,你將能夠像專業人士一樣創建自己的網絡應用程序!

Python - Socket Programming

什麼是 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