Netty通道关闭检测

12

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

4个回答

16

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

在Netty中有两种监听通道关闭事件的方式:

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

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

2) 如果您只能访问通道引用,则可以获取通道关闭的future,并将实现ChannelFutureListener与会话清理逻辑注册在一起,

ChannelFuture closeFuture = channel.closeFuture();

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

4
我已经实现了channelClosed方法,当用户关闭应用程序时,该方法运行良好。但是,如果用户只是失去WiFi连接,该方法不会被调用。 - Khaled Abu AlKheir
2
最好添加一个带有最佳读取空闲超时的IdleStateHandler。如果用户空闲时间超过该时间,很可能是连接丢失的情况,因此在服务器处理程序的IdleStateEvent上关闭连接。 - Jestan Nirojan
3
在更新版本的Netty中,getCloseFuture()似乎已经变成了closeFuture() - childofsoong

3

使用IdleStateHandler

可以检测在给定的时间间隔内是否有请求/响应。


2

问题已经有9年了,自那时以来发生了很多事情:2008年的经济崩溃、战争、冠状病毒等。好消息是,华尔街上的小型股票零售商似乎正在赢得与对冲基金的战争。

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

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

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

当服务器本身关闭通道时,这也适用。

希望能对某些人有所帮助。

1

检查会话ID并允许重新协商。或者您可以使用类似的cookie控制器。

我可以问一个与主题无关的问题吗:您的iOS客户端如何与Netty服务器交互?(在客户端方面使用了哪个框架,以及使用了哪个解码器/编码器?)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接