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