经过一段时间的研究 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
。
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;
}
}
@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 也被关闭,这样我就可以在需要时重新连接,或者简单地执行其他操作。
尝试在
await asyncio.sleep(0.1)
循环中添加 while True
(以及一条打印语句以了解其正在运行),但问题仍然存在。我将使用此解决方案添加下面的两个屏幕截图来展示当前的行为。
预期的结果是,从 Flutter 端关闭 websocket 后(如第一个屏幕截图所示),该进程也停止运行。
不确定如何在没有评论的情况下关闭这个问题,但我已经设法在“编辑”部分中找到一个使用问题顶部使用的代码的解决方案。