Я интегрирую конечную точку FastAPI с Flutter, в которой устанавливаю соединение Websocket. После этого интерфейс Flutter закрывает соединение Websocket нажатием кнопки.
Что должно произойти, так это соединение Websocket со стороны FastAPI также закрывается, но Websocket не закрывается, и исключение WebSocketDisconnectException не возникает, хотя веб-сокет Flutter сигнализируется как закрытый.
Кроме того, состояние клиента веб-сокета остается ПОДКЛЮЧЕННЫМ, даже если я закрыл это.
Код Flutter Websocket
Код: Выделить всё
class RealtimeDataService {
WebSocketChannel? channel;
void start(StreamController 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 с помощью «CTRL + C».
Что мне нужно, так это после веб-сокета Flutter закрыто, FastAPI также будет закрыт, чтобы я мог позже повторно подключиться, если потребуется, или просто выполнить другие действия.
Изменить 1
Попробовал добавить ожидание asyncio.sleep(0.1) (и оператор печати, чтобы знать, что он запущен) в цикл while True, но проблема остается. Ниже я добавлю два снимка экрана, демонстрирующих поведение этого решения на данный момент.
Предполагаемый результат заключается в том, чтобы после закрытия веб-сокета со стороны Flutter, как показано на первом снимке экрана, , процесс также прекращает работу.
Вывод до и после закрытия сокета со стороны Flutter.

Вывод после двухкратного нажатия CTRL+C.

Подробнее здесь: https://stackoverflow.com/questions/789 ... associated