Обнаружение закрытия канала Netty

Я создаю серверное клиентское приложение, используя netty и ios, я сталкиваюсь с проблемой, когда пользователь просто отключает WiFi на своем устройстве ios, сервер netty не знает об этом. Серверу нужно знать, чтобы выполнить очистку для этого пользователя и перевести его/ее в автономный режим, но теперь, когда пользователь снова пытается подключиться, сервер просто сообщает ему, что он/она уже онлайн.


person Khaled Abu AlKheir    schedule 09.01.2012    source источник


Ответы (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
    }
});
person Jestan Nirojan    schedule 09.01.2012
comment
Что ж, я реализовал метод channelClosed, и он отлично работает, например, когда пользователь закрывает приложение, но если пользователь просто теряет подключение к Wi-Fi, этот метод не вызывается. - person Khaled Abu AlKheir; 09.01.2012
comment
тогда лучше добавить IdleStateHandler с оптимальным временем ожидания чтения. Если пользователь бездействует больше этого времени, скорее всего, это может быть случай потери соединения, поэтому закройте соединение на IdleStateEvent из обработчика вашего сервера. - person Jestan Nirojan; 09.01.2012
comment
В более новых версиях Netty getCloseFuture() кажется closeFuture() - person childofsoong; 07.07.2015

Используйте IdleStateHandler.

Вы можете определить, когда нет запросов/ответов в заданные промежутки времени.

person jacktrades    schedule 26.07.2014

Проверьте идентификатор сеанса и разрешите повторное согласование. Или вы можете использовать что-то вроде контроллера cookie. Могу я задать вопрос не по теме: как ваш клиент на ios взаимодействует с сервером netty? (какую структуру вы используете на стороне клиента и какой декодер/кодировщик используете?)

person ikosdroid    schedule 18.04.2012

ну вопрос 9 лет много чего произошло с тех пор Экономический коллапс 2008 года, Войны, Коронавирус. С другой стороны, кажется, что мелкие розничные торговцы акциями выигрывают войну с хедж-фондами на Уолл-Стрит.

Вернемся к вопросу: мы столкнулись с аналогичной проблемой, когда нам приходилось предоставлять сообщение журнала на стороне сервера каждый раз, когда клиент закрывал канал. Приведенные выше решения не помогли, но через 9 лет в Netty тоже многое могло измениться.

Вместо этого мы расширили наш обработчик с помощью MessagetoMessageDecoder, который также расширяет ChannelInboundHandlerAdapter. Затем мы переопределяем метод void channelUnregistered, который срабатывает, когда канал отменяет регистрацию в своем EventLoop.

public void channelUnregistered(ChannelHandlerContext ctx) throws Exception {
    ctx.fireChannelUnregistered();
    //Your logic goes here...
}

Это также работает, когда сам сервер закрывает канал. Надеюсь, это поможет кому-то.

person Mani Quí    schedule 01.02.2021