【问题标题】:Netty Channel closed detectionNetty Channel 关闭检测
【发布时间】:2012-02-05 20:12:28
【问题描述】:

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

【问题讨论】:

    标签: ios timeout protocols netty


    【解决方案1】:

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

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

    【讨论】:

    • 好吧,我已经实现了 channelClosed 方法,例如当用户关闭应用程序时它可以正常工作,但是如果用户只是失去了他的 wifi 连接,则不会调用此方法。
    • 那么最好添加一个具有最佳读取空闲超时的 IdleStateHandler。如果用户空闲时间超过该时间,很可能是连接丢失的情况,因此请从您的服务器处理程序中关闭 IdleStateEvent 上的连接。
    • 在较新版本的 Netty 中,getCloseFuture() 似乎是 closeFuture()
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      使用IdleStateHandler

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

      【讨论】:

        【解决方案4】:

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

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2012-04-10
          • 2018-07-26
          • 1970-01-01
          • 2015-11-26
          • 2020-04-08
          • 1970-01-01
          • 1970-01-01
          • 2014-04-10
          • 1970-01-01
          相关资源
          最近更新 更多