2012-01-09 11 views
10

Estoy construyendo una aplicación cliente de servidor usando netty y ios, me enfrenta un problema cuando el usuario simplemente apaga WiFi en su dispositivo ios, el servidor de netty no lo sabe. El servidor necesita saber hacer la limpieza para ese usuario y desconectarlo, pero ahora cuando el usuario intenta conectarse de nuevo, el servidor simplemente le dice que ya está en línea.Netty Channel detección cerrada

Respuesta

13

Si he entendido su problema correctamente: ¿Quieres escuchar canal de cliente cierra eventos en el lado del servidor y hacer algo de limpieza de sesión,

Hay dos maneras de escuchar para el canal de eventos cerró en Netty:

1) Si el controlador de servidor se extiende SimpleChannelHandler/SimpleChannelHandler, entonces se puede reemplazar el método siguiente y escribir la lógica de limpieza de sesión no

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

2) Si sólo tiene acceso a la referencia de canal, entonces se puede g et al canal cerca de futuro y registrar su aplicación de ChannelFutureListener con su lógica de limpieza de sesión,

ChannelFuture closeFuture = channel.closeFuture(); 

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

Bueno, he implementado el método channelClosed, y funciona bien cuando el usuario cierra la aplicación, por ejemplo, pero si el usuario simplemente pierde su conexión wifi, este método no se llama. –

+2

, entonces es mejor agregar un IdleStateHandler con un tiempo de espera de lectura óptimo inactivo. Si el usuario está inactivo más de ese tiempo, lo más probable es que se trate de un caso perdido de conexión, por lo tanto, cierre la conexión en IdleStateEvent desde su controlador de servidor. –

+3

En las versiones más recientes de Netty, 'getCloseFuture()' parece ser 'closeFuture()' – childofsoong

1

Comprobar ID de sesión y permitir la renegociación. O puede usar algo como el controlador de cookies. ¿Puedo preguntar fuera de tema: ¿Cómo interactúa su cliente en iOS con el servidor de Netty? (Qué marco se utiliza en el lado del cliente, y lo decodificador/codificador uso?)