我正在使用Netty和iOS构建服务器客户端应用程序,在用户关闭其iOS设备上的WiFi时,我遇到了一个问题,即Netty服务器并不知道这一点。 服务器需要知道如何为该用户进行清理并将其设置为离线状态,但现在当用户再次尝试连接时,服务器只会告诉他/她已经在线。
如果我理解您的问题正确:您想在服务器端监听客户端通道关闭事件,并进行一些会话清理。
在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
}
});
问题已经有9年了,自那时以来发生了很多事情:2008年的经济崩溃、战争、冠状病毒等。好消息是,华尔街上的小型股票零售商似乎正在赢得与对冲基金的战争。
回到问题本身: 我们面临着一个类似的问题,即每当客户端关闭通道时,我们必须在服务器端提供日志信息。 上述提供的解决方案没有帮助,但在9年后,Netty可能也发生了很多变化。
相反,我们使用“MessagetoMessageDecoder”扩展了处理程序,该处理程序还扩展了ChannelInboundHandlerAdapter。 然后,我们覆盖了void方法“channelUnregistered”,该方法在通道从其EventLoop中注销时触发。
public void channelUnregistered(ChannelHandlerContext ctx) throws Exception {
ctx.fireChannelUnregistered();
//Your logic goes here...
}
当服务器本身关闭通道时,这也适用。
希望能对某些人有所帮助。检查会话ID并允许重新协商。或者您可以使用类似的cookie控制器。
我可以问一个与主题无关的问题吗:您的iOS客户端如何与Netty服务器交互?(在客户端方面使用了哪个框架,以及使用了哪个解码器/编码器?)
getCloseFuture()
似乎已经变成了closeFuture()
。 - childofsoong