Python中使用HTTPServer()实现基于WebSockets的多人聊天室
在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的多个浏览器窗口之间进行实时的聊天通信。每当有一个客户端发送消息时,所有连接的客户端收到相同的消息。
