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
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
}
});
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?)
Usa IdleStateHandler
è possibile rilevare quando non v'è alcuna richiesta/risposta in determinati intervalli di tempo.
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. –
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. –
Nelle versioni più recenti di Netty, 'getCloseFuture()' sembra essere 'closeFuture()' – childofsoong