怪奇物语

怪奇物语

首页 新随笔 联系 管理

socketio的小练习

image

服务端

#  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

posted on 2023-01-29 17:07  超级无敌美少男战士  阅读(254)  评论(0)    收藏  举报