Fastapi框架Websocket官方示例: https://fastapi.tiangolo.com/advanced/websockets/ 中有一个示例实现多个用户进行即时沟通,但这个示例只能实现多个用户在一起沟通,而不能实现多个用户随便分组随便沟通,因此对这个示例进行了修改实现了多房间多用户的沟通场景。修改的部分以及修改后的代码如下:本文地址:http://www.04007.cn/article/979.html,未经许可,不得转载.
from typing import List from fastapi import FastAPI, WebSocket, WebSocketDisconnect from fastapi.responses import HTMLResponse app = FastAPI() html = """ <!DOCTYPE html> <html> <head> <title>Chat</title> </head> <body> <h1>WebSocket Chat</h1> <h2>Your ID: <span id="ws-id"></span></h2> #添加了room_id参数 <h2>Room ID: <span id="room_id"></span></h2> <form action="" onsubmit="sendMessage(event)"> <input type="text" id="messageText" autocomplete="off"/> <button>Send</button> </form> <ul id='messages'> </ul> <script> var client_id = Date.now() document.querySelector("#ws-id").textContent = client_id; #随机生成room_id值,当前先分成3个房间,并显示在页面上以方便查看自己当前进入的房间。 var room_id = "room" + Math.floor(Math.random() * 10) % 3; document.querySelector("#room_id").textContent = room_id; #连接协议就需要改成添加room_id参数的URL了 #var ws = new WebSocket(`ws://127.0.0.1:8000/ws/${client_id}`); var ws = new WebSocket(`ws://127.0.0.1:8010/ws/${room_id}/${client_id}`); ws.onmessage = function(event) { var messages = document.getElementById('messages') var message = document.createElement('li') var content = document.createTextNode(event.data) message.appendChild(content) messages.appendChild(message) }; function sendMessage(event) { var input = document.getElementById("messageText") ws.send(input.value) input.value = '' event.preventDefault() } </script> </body> </html> """ class ConnectionManager: def __init__(self): self.active_connections: Dict = {} async def connect(self, room_id:str, websocket: WebSocket): await websocket.accept() if room_id in self.active_connections: self.active_connections[room_id].append(websocket) else: self.active_connections[room_id] = [] self.active_connections[room_id].append(websocket) def disconnect(self, room_id:str, websocket: WebSocket): self.active_connections[room_id].remove(websocket) async def send_personal_message(self, message: str, room_id:str, websocket: WebSocket): await websocket.send_text(message) async def broadcast(self, message: str, room_id:str): for connection in self.active_connections[room_id]: await connection.send_text(message) manager = ConnectionManager() @app.get("/") async def get(): return HTMLResponse(html) @app.websocket("/ws/{room_id}/{client_id}") async def websocket_endpoint(websocket: WebSocket, room_id:str, client_id: int): await manager.connect(room_id, websocket) try: while True: data = await websocket.receive_text() await manager.send_personal_message(f"You wrote: {data}", room_id, websocket) await manager.broadcast(f"Client #{client_id} says: {data}", room_id) except WebSocketDisconnect: manager.disconnect(room_id, websocket) await manager.broadcast(f"Client #{client_id} left the chat", room_id)本文地址:http://www.04007.cn/article/979.html,未经许可,不得转载.
本文地址:http://www.04007.cn/article/979.html 未经许可,不得转载. 手机访问本页请扫描右下方二维码.
![]() |
![]() |
手机扫码直接打开本页面 |