Я создаю серверное клиентское приложение, используя netty и ios, я сталкиваюсь с проблемой, когда пользователь просто отключает WiFi на своем устройстве ios, сервер netty не знает об этом. Серверу нужно знать, чтобы выполнить очистку для этого пользователя и перевести его/ее в автономный режим, но теперь, когда пользователь снова пытается подключиться, сервер просто сообщает ему, что он/она уже онлайн.
Обнаружение закрытия канала Netty
Ответы (4)
Если я правильно понял вашу проблему: вы хотите прослушивать события закрытия клиентского канала на стороне сервера и выполнять некоторую очистку сеанса,
Есть два способа прослушивания событий закрытия канала в Netty:
1) Если обработчик вашего сервера расширяет SimpleChannelHandler/SimpleChannelHandler
, вы можете переопределить следующий метод и написать там свою логику очистки сеанса.
public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception;
2) Если у вас есть доступ только к ссылке на канал, вы можете получить канал в ближайшем будущем и зарегистрировать свою реализацию ChannelFutureListener
с логикой очистки сеанса,
ChannelFuture closeFuture = channel.closeFuture();
closeFuture.addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) throws Exception {
//session cleanup logic
}
});
getCloseFuture()
кажется closeFuture()
- person childofsoong; 07.07.2015
Используйте IdleStateHandler.
Вы можете определить, когда нет запросов/ответов в заданные промежутки времени.
Проверьте идентификатор сеанса и разрешите повторное согласование. Или вы можете использовать что-то вроде контроллера cookie. Могу я задать вопрос не по теме: как ваш клиент на ios взаимодействует с сервером netty? (какую структуру вы используете на стороне клиента и какой декодер/кодировщик используете?)
ну вопрос 9 лет много чего произошло с тех пор Экономический коллапс 2008 года, Войны, Коронавирус. С другой стороны, кажется, что мелкие розничные торговцы акциями выигрывают войну с хедж-фондами на Уолл-Стрит.
Вернемся к вопросу: мы столкнулись с аналогичной проблемой, когда нам приходилось предоставлять сообщение журнала на стороне сервера каждый раз, когда клиент закрывал канал. Приведенные выше решения не помогли, но через 9 лет в Netty тоже многое могло измениться.
Вместо этого мы расширили наш обработчик с помощью MessagetoMessageDecoder, который также расширяет ChannelInboundHandlerAdapter. Затем мы переопределяем метод void channelUnregistered, который срабатывает, когда канал отменяет регистрацию в своем EventLoop.
public void channelUnregistered(ChannelHandlerContext ctx) throws Exception {
ctx.fireChannelUnregistered();
//Your logic goes here...
}
Это также работает, когда сам сервер закрывает канал. Надеюсь, это поможет кому-то.