Netty Channel关闭检测

Kha*_*eir 11 timeout protocols ios netty

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

Jes*_*jan 15

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

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

1)如果您的服务器处理程序扩展SimpleChannelHandler/SimpleChannelHandler,那么您可以覆盖以下方法并在那里编写会话清理逻辑

public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception;
Run Code Online (Sandbox Code Playgroud)

2)如果您只能访问通道引用,那么您可以使通道关闭将来并ChannelFutureListener使用会话清理逻辑注册您的实现,

ChannelFuture closeFuture = channel.closeFuture();

closeFuture.addListener(new ChannelFutureListener() {
    @Override
    public void operationComplete(ChannelFuture future) throws Exception {
        //session cleanup logic
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 好吧,我已经实现了channelClosed方法,并且当用户关闭应用程序时它工作正常,但是如果用户只是丢失了他的wifi连接,则不会调用此方法. (3认同)
  • 在较新版本的Netty中,`getCloseFuture()`似乎是`closeFuture()` (3认同)
  • 然后最好添加一个具有最佳读取空闲超时的IdleStateHandler.如果用户空闲时间超过该时间,则很可能是连接丢失的情况,因此请关闭IdleStateEvent与服务器处理程序的连接. (2认同)