Socket編程是計算機網絡編程的基礎,它允許兩臺計算機(或同一個計算機的不同進程)之間進行通信。Python 提供了 socket
模塊,可以很方便地進行 Socket 編程。下面是一些基本的 Socket 編程示例,包括 TCP 和 UDP。
TCP Socket 編程
TCP(傳輸控制協議)是一種面向連接的、可靠的、基于字節流的傳輸層通信協議。
服務器端
import socket# 創建一個 socket 對象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 綁定地址和端口
server_address = ('localhost', 65432)
server_socket.bind(server_address)# 開始監聽
server_socket.listen(5)
print('Server listening on', server_address)while True:# 等待連接print('Waiting for a connection...')connection, client_address = server_socket.accept()try:print('Connection from', client_address)# 接收數據while True:data = connection.recv(1024)if data:print('Received', repr(data))# 發送數據connection.sendall(data)else:breakfinally:# 清理連接connection.close()
客戶端
import socket# 創建一個 socket 對象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 連接到服務器
server_address = ('localhost', 65432)
client_socket.connect(server_address)try:# 發送數據message = 'This is the message. It will be echoed back.'print('Sending', repr(message))client_socket.sendall(message)# 接收數據amount_received = 0amount_expected = len(message)while amount_received < amount_expected:data = client_socket.recv(1024)amount_received += len(data)print('Received', repr(data))finally:# 清理連接client_socket.close()
UDP Socket 編程
UDP(用戶數據報協議)是一個簡單的面向數據報的傳輸層協議。它不保證數據包的順序、可靠性或完整性。
服務器端
import socket# 創建一個 socket 對象
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 綁定地址和端口
server_address = ('localhost', 10000)
sock.bind(server_address)print('Starting UDP server')while True:# 接收數據print('Waiting to receive message')data, address = sock.recvfrom(4096) # 緩沖區大小是 4096 字節print('Received {} bytes from {}'.format(len(data), address))print('Data: {}'.format(data))if data:sent = sock.sendto(data, address) # 將接收到的數據發送回去print('Sent {} bytes back to {}'.format(sent, address))
客戶端
import socket
import time# 創建一個 socket 對象
MESSAGE = 'This is the message.'
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 連接到服務器
server_address = ('localhost', 10000)try:# 發送數據print('Sending: {}'.format(MESSAGE))sent = sock.sendto(MESSAGE.encode(), server_address)# 接收響應time.sleep(1) # 等待一秒以確保服務器有時間處理請求data, server = sock.recvfrom(4096)print('Received: {}'.format(data.decode()))finally:# 清理連接print('Closing socket')sock.close()
注意事項
- 異常處理:在實際應用中,應添加更多的異常處理,以確保程序的健壯性。
- 并發:對于多個客戶端連接,可以使用多線程或異步編程來處理。
- 資源管理:確保在程序結束時正確關閉所有的 socket 連接。
以上是一些基礎的 Python Socket 編程示例,希望對你有所幫助。