Netty Channel关闭检测

时间:2012-01-09 09:05:49

标签: ios timeout protocols netty

我正在使用netty和ios构建服务器客户端应用程序,当用户在他/她的ios设备上关闭WiFi时,我遇到了问题,netty服务器不知道它。 服务器需要知道为该用户进行清理并将他/她设置为离线,但现在当用户再次尝试连接时,服务器只是告诉他他/她已经在线。

4 个答案:

答案 0 :(得分:15)

如果我正确理解您的问题:您希望在服务器端侦听客户端通道关闭事件并进行一些会话清理,

在Netty中有两种方法可以监听频道关闭事件:

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

答案 1 :(得分:3)

使用IdleStateHandler

您可以在给定的时间间隔内检测到没有请求/响应。

答案 2 :(得分:1)

检查会话ID并允许重新协商。或者您可以使用cookie控制器之类的东西。 请问主题问题:ios上的客户端如何与netty服务器进行交互? (你在客户端使用什么框架,以及解码器/编码器使用什么?)

答案 3 :(得分:0)

问题是 9 岁,从那时起发生了很多事情 2008 年经济崩溃、战争、冠状病毒。 从好的方面来说,小型股票零售商似乎正在赢得华尔街对冲基金的战争。

回到问题: 我们面临着类似的问题,每次客户端关闭通道时,我们都必须在服务器端提供日志消息。 上面提供的解决方案无济于事,但 9 年后,Netty 可能也发生了很多变化。

相反,我们使用“MessagetoMessageDecoder”扩展了我们的处理程序,它也扩展了 ChannelInboundHandlerAdapter。 然后我们重写 void 方法“channelUnregistered”,该方法在通道从其 EventLoop 中取消注册时触发。

public void channelUnregistered(ChannelHandlerContext ctx) throws Exception {
    ctx.fireChannelUnregistered();
    //Your logic goes here...
}

这在服务器本身关闭通道时也有效。 希望这对某人有所帮助。