#頭條創作挑戰賽#
socket是一種網絡通信的程式設計接口,它提供了一種機制,使得不同計算機上的程式可以通過網絡進行通信。在Socket程式設計中,伺服器和用戶端通過建立Socket連接配接來進行資料傳輸。
Python提供了socket子產品來實作Socket程式設計,可以使用它來建立Socket對象,并通過該對象進行資料的發送和接收。
以下是Python Socket的幾個常見使用場景及舉例:
網絡通信:
Socket最常見的用途是實作不同計算機之間的網絡通信。例如,一個伺服器程式可以通過Socket監聽某個端口,并接受來自用戶端的連接配接請求;用戶端程式可以通過Socket連接配接到伺服器,并發送請求或接收伺服器傳回的資料。
# 伺服器端代碼
import socket
# 建立一個Socket對象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 綁定IP位址和端口号
server_socket.bind(('127.0.0.1', 8888))
# 監聽連接配接
server_socket.listen(5)
while True:
# 接受用戶端連接配接
client_socket, addr = server_socket.accept()
print('接收到來自', addr, '的連接配接')
# 接收用戶端發送的資料
data = client_socket.recv(1024)
print('接收到資料:', data.decode())
# 發送資料給用戶端
client_socket.send('Hello, client!'.encode())
# 關閉連接配接
client_socket.close()
# 用戶端代碼
import socket
# 建立一個Socket對象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 連接配接伺服器
client_socket.connect(('127.0.0.1', 8888))
# 發送資料給伺服器
client_socket.send('Hello, server!'.encode())
# 接收伺服器傳回的資料
data = client_socket.recv(1024)
print('接收到資料:', data.decode())
# 關閉連接配接
client_socket.close()
檔案傳輸:
Socket可以用于實作檔案的傳輸。例如,一個伺服器程式可以接受用戶端傳來的檔案,并儲存在本地;用戶端程式可以通過Socket将本地的檔案發送給伺服器。
# 伺服器端代碼
import socket
# 建立一個Socket對象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 綁定IP位址和端口号
server_socket.bind(('127.0.0.1', 8888))
# 監聽連接配接
server_socket.listen(5)
while True:
# 接受用戶端連接配接
client_socket, addr = server_socket.accept()
print('接收到來自', addr, '的連接配接')
# 接收用戶端發送的檔案
with open('received_file.txt', 'wb') as file:
data = client_socket.recv(1024)
while data:
file.write(data)
data = client_socket.recv(1024)
print('檔案接收完畢')
# 發送确認消息給用戶端
client_socket.send('檔案接收完畢'.encode())
# 關閉連接配接
client_socket.close()
# 用戶端代碼
import socket
# 建立一個Socket對象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 連接配接伺服器
client_socket.connect(('127.0.0.1', 8888))
# 發送檔案給伺服器
with open('file_to_send.txt', 'rb') as file:
data = file.read(1024)
while data:
client_socket.send(data)
data = file.read(1024)
print('檔案發送完畢')
# 接收伺服器的确認消息
data = client_socket.recv(1024)
print('接收到确認消息:', data.decode())
# 關閉連接配接
client_socket.close()
實時通信:
Socket可以用于實作實時通信,例如聊天室、實時消息傳遞等。伺服器可以通過Socket接受來自多個用戶端的連接配接,并實時地将消息發送給所有連接配接的用戶端。
# 伺服器端代碼
import socket
import threading
# 建立一個Socket對象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 綁定IP位址和端口号
server_socket.bind(('127.0.0.1', 8888))
# 監聽連接配接
server_socket.listen(5)
# 存儲所有連接配接的用戶端
clients = []
def handle_client(client_socket, client_address):
while True:
# 接收用戶端發送的消息
data = client_socket.recv(1024)
message = data.decode()
print('接收到來自', client_address, '的消息:', message)
# 将消息發送給所有連接配接的用戶端(除了發送者)
for client in clients:
if client != client_socket:
client.send(message.encode())
# 如果用戶端發送了"bye"消息,則斷開連接配接
if message == 'bye':
clients.remove(client_socket)
client_socket.close()
print('與', client_address, '的連接配接已斷開')
break
while True:
# 接受用戶端連接配接
client_socket, client_address = server_socket.accept()
print('接收到來自', client_address, '的連接配接')
# 将用戶端添加到連接配接清單
clients.append(client_socket)
# 啟動線程處理用戶端消息
threading.Thread(target=handle_client, args=(client_socket, client_address)).start()
# 用戶端代碼
import socket
import threading
# 建立一個Socket對象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 連接配接伺服器
client_socket.connect(('127.0.0.1', 8888))
def receive_message():
while True:
# 接收伺服器發送的消息
data = client_socket.recv(1024)
message = data.decode()
print('接收到消息:', message)
# 如果接收到"bye"消息,則斷開連接配接
if message == 'bye':
client_socket.close()
print('與伺服器的連接配接已斷開')
break
# 啟動線程接收伺服器消息
threading.Thread(target=receive_message).start()
while True:
# 發送消息給伺服器
message = input('請輸入消息:')
client_socket.send(message.encode())
# 如果發送了"bye"消息,則斷開連接配接
if message == 'bye':
client_socket.close()
print('與伺服器的連接配接已斷開')
break
遠端指令執行:
Socket可以用于實作遠端指令執行。例如,一個伺服器程式可以接受用戶端發送的指令,并在伺服器上執行該指令,将結果傳回給用戶端。
# 伺服器端代碼
import socket
import subprocess
# 建立一個Socket對象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 綁定IP位址和端口号
server_socket.bind(('127.0.0.1', 8888))
# 監聽連接配接
server_socket.listen(5)
while True:
# 接受用戶端連接配接
client_socket, addr = server_socket.accept()
print('接收到來自', addr, '的連接配接')
# 接收用戶端發送的指令
command = client_socket.recv(1024).decode()
print('接收到指令:', command)
# 執行指令并擷取輸出結果
result = subprocess.getoutput(command)
# 發送輸出結果給用戶端
client_socket.send(result.encode())
# 關閉連接配接
client_socket.close()
# 用戶端代碼
import socket
# 建立一個Socket對象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 連接配接伺服器
client_socket.connect(('127.0.0.1', 8888))
# 發送指令給伺服器
command = input('請輸入要執行的指令:')
client_socket.send(command.encode())
# 接收伺服器傳回的輸出結果
result = client_socket.recv(1024).decode()
print('接收到輸出結果:', result)
# 關閉連接配接
client_socket.close()