欢迎访问宙启技术站
智能推送

使用Python实现一个可扩展的服务器

发布时间:2023-12-27 13:06:36

以下是一个使用Python实现的可扩展服务器的例子:

import socket
import threading


class Server:
    def __init__(self, ip, port):
        self.ip = ip
        self.port = port
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.clients = []

    def start(self):
        self.socket.bind((self.ip, self.port))
        self.socket.listen(5)
        print(f"Server started at {self.ip}:{self.port}")

        while True:
            client_socket, address = self.socket.accept()
            print(f"New connection from {address[0]}:{address[1]}")

            self.clients.append(client_socket)
            threading.Thread(target=self.handle_client, args=(client_socket,)).start()

    def handle_client(self, client_socket):
        while True:
            try:
                data = client_socket.recv(1024).decode()
                if data:
                    print(f"Received data: {data}")
                    # 根据接收到的数据执行相应的操作
                    # 例如,可以实现一个简单的聊天室
                    self.broadcast(data, client_socket)
                else:
                    # 如果客户端断开连接,则移除客户端
                    self.clients.remove(client_socket)
                    print('Client disconnected')
                    break
            except Exception as e:
                print(f"Error occurred: {e}")
                break

    def broadcast(self, message, exclude_client):
        for client_socket in self.clients:
            if client_socket != exclude_client:
                try:
                    client_socket.sendall(message.encode())
                except Exception as e:
                    print(f"Error occurred while broadcasting: {e}")


if __name__ == '__main__':
    server = Server('localhost', 1234)
    server.start()

以上代码实现了一个简单的服务器,在指定的 IP 地址和端口上启动监听,并能够接收来自客户端的连接。每个客户端连接都会启动一个线程进行处理。

start() 方法中,服务器通过 bind()listen() 方法绑定和监听指定的 IP 地址和端口。然后进入一个无限循环,不断接受新的连接。

handle_client() 方法中,服务器通过接收客户端发送的数据来执行相应的操作。在这个例子中,它通过调用 broadcast() 方法将接收到的消息广播给所有连接的客户端。

broadcast() 方法遍历客户端列表,并将消息发送给除发送消息的客户端之外的所有客户端。如果发送时出现错误,则打印错误信息。

你可以通过创建多个客户端来测试该服务器,例如使用 Telnet 或使用另一个 Python 脚本。

注意:以上代码只是一个示例,可能并不适用于生产环境,并且可能需要根据具体的需求进行修改和扩展。为了实现更高级的功能,可能需要添加身份验证、加密等。