Python Socket常见使用场景及示例

#头条创作挑战赛#

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()
原文链接:,转发请注明来源!