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

Python中使用HTTPServer()实现基于WebSockets的多人聊天室

发布时间:2023-12-26 14:49:11

在Python中,可通过使用HTTPServer()WebSocketHandler类来实现基于WebSockets的多人聊天室。下面是使用WebSocket实现简单的多人聊天室的示例代码:

from http.server import HTTPServer, SimpleHTTPRequestHandler
from websocket import WebSocketHandler, SimpleWebSocketServer

# 定义全局变量,用于保存连接的客户端
clients = []

# 自定义WebSocket处理类
class ChatWebSocketHandler(WebSocketHandler):

    def handle(self):
        # 当有新的WebSocket连接建立时,将其添加到客户端列表中
        clients.append(self)

        while True:
            # 接收客户端发送的消息
            message = self.receive()

            if message is None:
                # 如果没有消息,则表示连接已经关闭,将其从客户端列表中删除
                clients.remove(self)
                break
            else:
                # 将消息发送给所有连接的客户端
                for client in clients:
                    client.send(message)

# 定义HTTP请求处理类
class ChatHTTPRequestHandler(SimpleHTTPRequestHandler):

    def do_GET(self):
        # 如果请求的是WebSocket的URL,则将请求交给WebSocket处理类处理
        if self.headers.get('Upgrade', '').lower() == 'websocket':
            WebSocketHandler(self.server, self.request, self.client_address, self.headers).handle()
        else:
            super().do_GET()

if __name__ == '__main__':
    # 创建HTTP服务器,并指定请求处理类为自定义的ChatHTTPRequestHandler类
    http_server = HTTPServer(('localhost', 8080), ChatHTTPRequestHandler)

    # 创建WebSocket服务器,并指定处理类为自定义的ChatWebSocketHandler类
    websocket_server = SimpleWebSocketServer(('localhost', 8000), ChatWebSocketHandler)

    # 启动HTTP服务器和WebSocket服务器
    try:
        http_server.serve_forever()
    except KeyboardInterrupt:
        pass
    finally:
        http_server.server_close()
        websocket_server.close()

上述示例代码中,我们定义了一个全局变量clients,用于存储连接的客户端。ChatWebSocketHandler类继承自WebSocketHandler类,并实现了handle方法来处理WebSockets连接。在handle方法中,我们首先将新的WebSocket连接添加到客户端列表中,然后通过一个无限循环来接收客户端发送的消息,并将消息发送给所有连接的客户端。

ChatHTTPRequestHandler类继承自SimpleHTTPRequestHandler类,并重写do_GET方法来处理HTTP请求。在do_GET方法中,我们通过判断请求的Upgrade头部字段是否为websocket来确定是否为WebSocket请求,如果是,则将请求交给ChatWebSocketHandler类处理;否则,调用父类的do_GET方法处理普通的HTTP请求。

最后,在__main__函数中,我们创建了一个HTTPServer实例,并将请求处理类指定为ChatHTTPRequestHandler类;同时创建了一个SimpleWebSocketServer实例,并将处理类指定为ChatWebSocketHandler类。然后,我们通过调用serve_forever方法来启动HTTP服务器和WebSocket服务器。这样,当有新的WebSocket连接或HTTP请求到达时,相应的处理类将被调用来处理连接或请求。

使用上述代码作为服务器代码后,可以使用任何支持WebSocket的Web浏览器作为客户端。以下是一个使用JavaScript代码作为WebSocket客户端的示例:

// 创建WebSocket连接
const socket = new WebSocket('ws://localhost:8000');

// 关闭连接时的处理函数
socket.onclose = () => {
    console.log('WebSocket connection closed');
};

// 接收消息时的处理函数
socket.onmessage = (event) => {
    const message = event.data;
    console.log('Received message:', message);
};

// 发送消息
socket.send('Hello, world!');

上述JavaScript代码创建了一个WebSocket连接,并设置了连接关闭和接收消息时的处理函数。然后,使用send方法向服务器发送消息。

使用上述代码,可以在支持WebSockets的多个浏览器窗口之间进行实时的聊天通信。每当有一个客户端发送消息时,所有连接的客户端收到相同的消息。