【发布时间】:2012-02-05 20:12:28
【问题描述】:
我正在使用 netty 和 ios 构建服务器客户端应用程序,当用户刚刚在他/她的 ios 设备上关闭 WiFi 时,我遇到了一个问题,netty 服务器不知道它。 服务器需要知道为该用户进行清理并将他/她设置为离线,但是现在当用户尝试再次连接时,服务器只是告诉他他/她已经在线。
【问题讨论】:
标签: ios timeout protocols netty
我正在使用 netty 和 ios 构建服务器客户端应用程序,当用户刚刚在他/她的 ios 设备上关闭 WiFi 时,我遇到了一个问题,netty 服务器不知道它。 服务器需要知道为该用户进行清理并将他/她设置为离线,但是现在当用户尝试再次连接时,服务器只是告诉他他/她已经在线。
【问题讨论】:
标签: ios timeout protocols netty
如果我正确理解了您的问题:您想在服务器端侦听客户端通道关闭事件并进行一些会话清理,
在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
}
});
【讨论】:
getCloseFuture() 似乎是 closeFuture()
检查会话 ID 并允许重新协商。或者你可以使用类似 cookie 控制器的东西。 请问题外话:你的ios客户端如何与netty服务器交互? (您在客户端使用什么框架,以及使用什么解码器/编码器?)
【讨论】:
您可以检测到在给定的时间间隔内何时没有请求/响应。
【讨论】:
问题是 9 岁,从那以后发生了很多事情 2008 年经济崩溃、战争、冠状病毒。 从好的方面来看,小型股票零售商似乎正在赢得华尔街对冲基金的战争。
回到问题: 我们遇到了类似的问题,每次客户端关闭通道时,我们都必须在服务器端提供一条日志消息。 上面提供的解决方案没有帮助,但在 9 年后,Netty 可能也发生了很多变化。
相反,我们使用“MessagetoMessageDecoder”扩展了我们的处理程序,它也扩展了 ChannelInboundHandlerAdapter。 然后我们重写 void 方法“channelUnregistered”,该方法在通道从其 EventLoop 中注销时触发。
public void channelUnregistered(ChannelHandlerContext ctx) throws Exception {
ctx.fireChannelUnregistered();
//Your logic goes here...
}
这在服务器本身关闭频道时也有效。 希望这对某人有所帮助。
【讨论】: