Я создаю клиентское приложение сервера, используя netty и ios. У меня возникла проблема, когда пользователь просто отключает WiFi на своем устройстве ios, сетевой сервер не знает об этом. Сервер должен знать, как сделать очистку для этого пользователя, и установить его в автономном режиме, но теперь, когда пользователь пытается подключиться снова, сервер просто сообщает ему, что он/она уже подключен к сети.Netty Channel закрытое обнаружение
ответ
Если я правильно понял вашу проблему: Вы хотите прослушивать канал клиента закрыл событие в стороне сервера и сделать некоторые сеанс очистки,
Есть два способа прослушивающего канал закрыт событие в Нетти:
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
}
});
Проверьте идентификатор сеанса и позволяют повторное согласование. Или вы можете использовать что-то вроде контроллера cookie. Могу ли я задать вопрос на тему: как ваш клиент на ios взаимодействует с netty-сервером? (Какие рамки вы используете на стороне клиента, и что декодер/кодер использовать?)
Использование IdleStateHandler
Вы можете обнаружить, когда нет запроса/ответов в заданные интервалы времени.
Ну, я реализовал метод channelClosed, и он отлично работает, когда пользователь закрывает приложение, например, но если пользователь просто потерял соединение Wi-Fi, этот метод не вызывается. –
, то лучше добавить IdleStateHandler с оптимальным временем ожидания простоя. Если пользователь простаивает больше, чем это время, скорее всего, это может быть потерянный случай подключения, поэтому закройте соединение с IdleStateEvent от вашего обработчика сервера. –
В новых версиях Netty 'getCloseFuture()' кажется 'closeFuture()' – childofsoong