赞
踩
下午没事看了看WebSocket,感觉这个挺好玩的,比写CRUD有意思。就复制了官网的demo演示看了看。
官方文档 https://fastapi.tiangolo.com/advanced/websockets/
使用Python FastAPI框架官网demo
from typing import List from fastapi import FastAPI, WebSocket, WebSocketDisconnect app = FastAPI() class ConnectionManager: def __init__(self): # 存放激活的ws连接对象 self.active_connections: List[WebSocket] = [] async def connect(self, ws: WebSocket): # 等待连接 await ws.accept() # 存储ws连接对象 self.active_connections.append(ws) def disconnect(self, ws: WebSocket): # 关闭时 移除ws对象 self.active_connections.remove(ws) @staticmethod async def send_personal_message(message: str, ws: WebSocket): # 发送个人消息 await ws.send_text(message) async def broadcast(self, message: str): # 广播消息 for connection in self.active_connections: await connection.send_text(message) manager = ConnectionManager() @app.websocket("/ws/{user}") async def websocket_endpoint(websocket: WebSocket, user: str): await manager.connect(websocket) await manager.broadcast(f"用户{user}进入聊天室") try: while True: data = await websocket.receive_text() await manager.send_personal_message(f"你说了: {data}", websocket) await manager.broadcast(f"用户:{user} 说: {data}") except WebSocketDisconnect: manager.disconnect(websocket) await manager.broadcast(f"用户-{user}-离开") if __name__ == "__main__": import uvicorn # 官方推荐是用命令后启动 uvicorn main:app --host=127.0.0.1 --port=8010 --reload uvicorn.run(app='main:app', host="127.0.0.1", port=8010, reload=True, debug=True)
前端只是简单使用演示, 没有对连接做鉴权处理。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>聊天1</title> </head> <body> <h1>User1 Chat</h1> <form action="" onsubmit="sendMessage(event)"> <input type="text" id="messageText" autocomplete="off"/> <button>Send</button> </form> <ul id='messages'> </ul> <script> var ws = new WebSocket("ws://127.0.0.1:8010/ws/user1"); 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>
用户2, 和上面的用户1没什么区别,只是连接WebSocket 参数变化区分,
其他地方一样,就是url参数变化了。
<script> var ws = new WebSocket("ws://127.0.0.1:8010/ws/user2"); 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>
WebSocket使用还是很简单的,但是封装鉴权,前端断线重连等等操作还是很耗时的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。