2012-01-09 55 views
10

我建立使用网状和iOS的服务器客户端应用程序,我面临着一个问题,当用户只需开启关闭WiFi他/她的iOS设备上,在网状服务器不知道这件事。 服务器需要知道要为该用户执行清理并将其设置为脱机,但现在当用户再次尝试连接时,服务器只是告诉他他/她已经联机。Netty的通道封闭检测

回答

13

如果我理解正确的话您的问题:你想监听客户端通道关闭的事件在服务器端,并做一些会话清理,

有两种方法来监听通道关闭的事件Ne​​tty中:

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方法,当用户关闭例如应用程序它工作正常,但如果用户只是损失了WiFi连接,这种方式不叫。 – 2012-01-09 12:00:24

+2

那么最好添加一个具有最佳读取空闲超时的IdleStateHandler。如果用户闲置超过这个时间,最有可能是连接丢失的情况下,所以关闭IdleStateEvent从你的服务器处理程序的连接。 – 2012-01-09 15:36:13

+3

在较新版本的Netty中,'getCloseFuture()'似乎是'closeFuture()' – childofsoong 2015-07-07 20:33:08

1

检查会话ID和允许重新谈判。或者你可以使用类似cookie控制器的东西。 我可以问一个问题:你的ios客户端如何与netty服务器交互? (您使用在客户端什么框架,什么解码器/编码器配合使用?)