#rust #serde #rust-tokio
Вопрос:
Я нашел библиотеку под названием tokio-serde, которая будет отправлять и получать данные с помощью сокета tokio tcp, а также сериализовывать и десериализовывать их с помощью serde json.
Есть два примера, которые покажут, как вы можете создать сервер и клиент с помощью этой библиотеки.
В этом примере вы можете увидеть, как отправлять данные с помощью serialized
объекта.
serialized
.send(json!({...}));
https://github.com/carllerche/tokio-serde/blob/master/examples/client.rs
Поэтому я создал серверное приложение и сохранил serialized
объекты в векторе, чтобы отправлять им сообщения позже. Но по любой причине эти соединения могут быть отключены, и одноранговый клиент может быть недоступен.
Здесь моя проблема в том, как я могу определить, когда клиент отключен, используя serialized
объект ?
Я просмотрел документацию, но не смог найти никакого решения.
Любая помощь действительно ценится. Огромное спасибо.
Комментарии:
1. В общем случае вы получите ошибку при чтении или записи в поток, если другая сторона отключилась. Tokio-serde, похоже, просто подчиняется базовому типу ошибки, который будет
std::io::Error
. Кроме того, вы можете проверить его с помощью.ready()
TcpStream
и обнаружить любые ошибки таким образом.
Ответ №1:
Согласно комментарию @kmdreko. Я попытался получить доступ к базовому TcpSocket
и определить состояние отключения, используя это.
Что-то подобное помогло бы определить, отключен ли клиент:
if serialized.get_ref().get_ref().as_ref().ready(Interest::WRITABLE).await.is_err() {
// Connection error
}
Я знаю, что есть много get_ref()
звонков, но это то, что я нашел на данный момент.