2012-01-09 5 views
10

Sto costruendo un'applicazione client server che utilizza netty e ios, sto affrontando un problema quando l'utente si limita a disattivare il WiFi sul suo dispositivo ios, il server netty non lo sa. Il server deve sapere di eseguire la pulizia per quell'utente e impostarlo offline, ma ora quando l'utente prova a connettersi di nuovo, il server gli dice che è già in linea.Rilevazione chiusa Netty Channel

risposta

13

Se ho capito il problema in modo corretto: si desidera ascoltare per canale client eventi chiuso nel lato server e fare qualche sessione di pulizia,

Ci sono due modi per ascoltare per il canale eventi chiuso nel Netty:

1) Se il gestore del server estende SimpleChannelHandler/SimpleChannelHandler, allora è possibile ignorare il metodo seguito e scrivere la vostra logica di pulizia sessione ci

public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception; 

2) Se avete solo l'accesso al canale di riferimento, allora si può g et il canale vicino futuro e registrare l'implementazione della ChannelFutureListener con la vostra logica di pulizia della sessione,

ChannelFuture closeFuture = channel.closeFuture(); 

closeFuture.addListener(new ChannelFutureListener() { 
    @Override 
    public void operationComplete(ChannelFuture future) throws Exception { 
     //session cleanup logic 
    } 
}); 
+3

Bene, ho implementato il metodo channelClosed e funziona correttamente quando l'utente chiude l'applicazione, ad esempio, ma se l'utente perde la sua connessione wifi, questo metodo non viene chiamato. –

+2

quindi meglio aggiungere un IdleStateHandler con un timeout di inattività ottimale della lettura. Se l'utente è inattivo più di quel tempo, molto probabilmente potrebbe essere il caso di perdita di connessione, quindi chiudere la connessione su IdleStateEvent dal gestore del server. –

+3

Nelle versioni più recenti di Netty, 'getCloseFuture()' sembra essere 'closeFuture()' – childofsoong

1

Controllare id di sessione e consentire rinegoziazione. Oppure puoi usare qualcosa come il controller dei cookie. Posso porre una domanda fuori tema: in che modo il tuo client su ios interagisce con il server netty? (Quale quadro si utilizza sul lato client, e che cosa decoder/encoder uso?)

3

Usa IdleStateHandler

è possibile rilevare quando non v'è alcuna richiesta/risposta in determinati intervalli di tempo.