FastAPI Websocket 在关闭关联的 Flutter Websocket 后未关闭或引发异常

问题描述 投票:0回答:1

可能的工作解决方案

经过一段时间的研究 StackOverflow 和 Reddit,我在我的

while True
循环中尝试了以下代码:

try:
    await asyncio.wait_for( websocket.receive_text(), timeout=0.1)
except asyncio.TimeoutError:
    pass

当 websocket 已经关闭时,似乎会触发 WebSocketDisconnect 异常。有类似问题的朋友可以尝试一下!我将对此进行更多实验,如果它确实有效,我将关闭此问题。

概述

我正在将 FastAPI 的端点与 Flutter 集成,并在其中建立 Websocket 连接。之后,Flutter 前端通过单击按钮关闭 Websocket 连接。 应该发生的情况是来自 FastAPI 端的 Websocket 连接也会关闭,但 Websocket 不会关闭,也不会引发 WebSocketDisconnectException,尽管 Flutter websocket 已发出关闭信号。 此外,即使我关闭了 websocket 的客户端状态,它仍保持为

CONNECTED

Flutter Websocket 代码

class RealtimeDataService {
  WebSocketChannel? channel;
  void start(StreamController<Map> controller, String cameraID) async {
    channel = WebSocketChannel.connect(
      Uri.parse('ws://localhost:8001/camera/$cameraID'),
    );
    channel!.stream.listen((event) async {
      Map data = bson.BsonCodec.deserialize(bson.BsonBinary.from(event));
      controller.add(data);
    });
  }

  void stop() {
    if (channel == null) return;
    channel!.sink.close();
    channel = null;
  }
}

FastAPI Websocket 代码

@app.websocket("/camera/{camera_id}")
async def read_camera(websocket: WebSocket, camera_id: int):
    await websocket.accept()

    try:
        while True:
            # print(websocket.client_state.name)
            print('Running') # Suggested solution from Edit 1
            await asyncio.sleep(0.1) # Suggested solution from Edit 1
    except WebSocketDisconnect:
        print('Client disconnected')
        raise HTTPException(status_code=200, detail="Client disconnected")
    except:
        print('Error capturing camera')
        await websocket.close()
        raise HTTPException(status_code=200, detail="Camera is not available")

我尝试在 FastAPI websocket 中接收消息,并尝试捕获尝试通过关闭的 websocket 发送消息时引发的异常,但它似乎并没有改变结果。 不仅 websocket 没有关闭,我也无法用“CTRL+C”关闭 FastAPI 服务器。

我需要的是,在 Flutter websocket 关闭后,FastAPI 也被关闭,这样我就可以在需要时重新连接,或者简单地执行其他操作。

编辑1

尝试在

await asyncio.sleep(0.1)
循环中添加
while True
(以及一条打印语句以了解其正在运行),但问题仍然存在。我将使用此解决方案添加下面的两个屏幕截图来展示当前的行为。

预期的结果是,从 Flutter 端关闭 websocket 后(如第一个屏幕截图所示),该进程也停止运行。

Flutter 侧关闭套接字之前和之后的输出。 Output before and after closing the sock

连续使用两次CTRL+C后的输出。 Output after using CTRL+C two times in a row.

python flutter websocket fastapi
1个回答
0
投票

不确定如何在没有评论的情况下关闭这个问题,但我已经设法在“编辑”部分中找到一个使用问题顶部使用的代码的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.