天天看點

Python Socket常見使用場景及示例

作者:運維木子李

#頭條創作挑戰賽#

socket是一種網絡通信的程式設計接口,它提供了一種機制,使得不同計算機上的程式可以通過網絡進行通信。在Socket程式設計中,伺服器和用戶端通過建立Socket連接配接來進行資料傳輸。

Python提供了socket子產品來實作Socket程式設計,可以使用它來建立Socket對象,并通過該對象進行資料的發送和接收。

Python 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()