socketio的小练习
服务端
# socketio import socketio # fastapi from fastapi import FastAPI, WebSocket, Request, WebSocketDisconnect from fastapi.responses import RedirectResponse, HTMLResponse from fastapi.staticfiles import StaticFiles from fastapi.openapi.docs import get_swagger_ui_html from fastapi.templating import Jinja2Templates from fastapi.middleware.cors import CORSMiddleware # 启动数据库 # from config.config import initiate_database # 引入路由 # from routes.scheduler import scheduler_router # from routes.status import status_router # from routes.config import config_router # from routes.control import control_router # from routes.navigate import navigate_router # from routes.other import other_router # from routes.audio import audio_router # from socket_routes.status import add_status_schedulers # from websocket.manager import websocketmanager # scheduler # from myscheduler.scheduler import scheduler # docs_url一定要设置成None,才会使用本地的 swagger-ui 的静态文件 app = FastAPI(docs_url=None) # socketio sio = socketio.AsyncServer(async_mode="asgi", cors_allowed_origins=[]) app.mount("/ws", socketio.ASGIApp(sio)) app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) templates = Jinja2Templates(directory="templates") app.mount('/static', StaticFiles(directory='static'), name='static') @app.get('/docs', include_in_schema=False) async def custom_swagger_ui_html(): return get_swagger_ui_html( openapi_url=app.openapi_url, title=app.title + " - Swagger UI ", oauth2_redirect_url=app.swagger_ui_oauth2_redirect_url, swagger_js_url="/static/swagger-ui/swagger-ui-bundle.js", swagger_css_url="/static/swagger-ui/swagger-ui.css", swagger_favicon_url="/static/swagger-ui/favicon.png" ) # 初始化事件 @app.on_event("startup") async def start_database(): # await initiate_database() # 启动定时器 # scheduler.start() pass # docs文档 @app.get("/", tags=["Docs"]) async def get_docs(): return RedirectResponse("/docs") # jinjia2的测试网页 @app.get("/agv", response_class=HTMLResponse) async def read_jinjia2(request: Request): return templates.TemplateResponse("index.html", {"request": request }) # websocket的测试网页 @app.get("/websocket", response_class=HTMLResponse) async def websocket_test(request: Request): return templates.TemplateResponse("websocket.html", {"request": request}) @app.websocket("/wstest") async def websocket_endpoint(websocket: WebSocket): await websocket.accept() while True: data = await websocket.receive_text() await websocket.send_text(f"send from serve: {data}") # app.include_router(scheduler_router, tags=["Scheduler"], prefix="/scheduler") # app.include_router(status_router, tags=["Status"], prefix="/status") # app.include_router(config_router, tags=["Config"], prefix="/config") # app.include_router(control_router, tags=["Control"], prefix="/control") # app.include_router(navigate_router, tags=["Navigate"], prefix="/navigate") # app.include_router(other_router, tags=["Other"], prefix="/other") # app.include_router(audio_router, tags=['Audio Control'], prefix='/audio') @sio.event async def connect(sid, environ): # 连接成功之后,会自动恢复一个connect事件给前端 print(f'~~~~sid={sid}, {environ["HTTP_ORIGIN"]},连接成功~~~~') sio.enter_room(sid,'agv') await sio.emit('message',f'sid={sid},进入房间',room='agv') @sio.event async def disconnect(sid): # 连接成功之后,会自动恢复一个connect事件给前端 print(f'~~~~sid={sid},断开连接~~~~') sio.leave_room(sid,'agv') await sio.emit('disconnect',f'sid={sid},离开房间',room='agv') @sio.event async def message(sid,data): # 连接成功之后,会自动恢复一个connect事件给前端 print(f'~~~~data = {data}, message from sid={sid}~~~~') await sio.emit('message','msg from server',room='agv') # @sio.on('connect') # async def connect(sid,environ): # print(f'sid={sid},连接成功') # await sio.emit('connect','pong',to=sid) # @sio.disconnect # async def disconnect(sid): # print(f'sid={sid},断开连接') # client_id代表用户的唯一标识,用来区分不同的用户 # @app.websocket("/ws") # async def websocket_endpoint(websocket: WebSocket): # # 将新的socket连接存储起来 # await websocketmanager.connect(websocket) # try: # while True: # # data = await websocket.receive_json() # data = await websocket.receive_text() # data_dict = eval(data) # if 'websocket' in data_dict: # 处理心跳检测 # await websocket.send_text("pong") # else: # print('start') # await add_status_schedulers(websocket) # except WebSocketDisconnect: # websocketmanager.disconnect(websocket) # await websocketmanager.broadcast(f"Client left the chat")
客户端
https://files.cnblogs.com/files/zhuoss/vite-project.7z?t=1674983354
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
2022-01-29 对象的解构赋值
2022-01-29 数组解构赋值和展开运算符