2012-01-09 1 views
10

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

ответ

13

Если я правильно понял вашу проблему: Вы хотите прослушивать канал клиента закрыл событие в стороне сервера и сделать некоторые сеанс очистки,

Есть два способа прослушивающего канал закрыт событие в Нетти:

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 
    } 
}); 
+3

Ну, я реализовал метод channelClosed, и он отлично работает, когда пользователь закрывает приложение, например, но если пользователь просто потерял соединение Wi-Fi, этот метод не вызывается. –

+2

, то лучше добавить IdleStateHandler с оптимальным временем ожидания простоя. Если пользователь простаивает больше, чем это время, скорее всего, это может быть потерянный случай подключения, поэтому закройте соединение с IdleStateEvent от вашего обработчика сервера. –

+3

В новых версиях Netty 'getCloseFuture()' кажется 'closeFuture()' – childofsoong

1

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

3

Использование IdleStateHandler

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