关于 netty 检测客户端异常关闭 有什么好的 解决方案

wind_sizemore 2015-10-08 10:05:29
我的应用中,客户端与服务器是长连接,客户端断开后,需要清空一些玩家的缓存信息。
我测试了客户端强制关闭后,服务器会打印一下异常信息:
java.io.IOException: 远程主机强迫关闭了一个现有的连接。
引用

at sun.nio.ch.SocketDispatcher.read0(Native Method)
at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:225)
at sun.nio.ch.IOUtil.read(IOUtil.java:193)
at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:359)
at io.netty.buffer.UnpooledUnsafeDirectByteBuf.setBytes(UnpooledUnsafeDirectByteBuf.java:436)
at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:870)
at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:208)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:88)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:485)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:452)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:346)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:101)
at java.lang.Thread.run(Thread.java:722)
但是在我的应用层感觉没法捕获到,也不好判断。如果不检测这个异常,有什么好的解决方案来监听客户端异常断开
...全文
8173 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wind_sizemore 2015-10-09
  • 打赏
  • 举报
回复
我在阅读netty权威指南的时候,找到了解决办法。我的需求简单来说,就是客户端异常关闭,服务器端监听到,然后做相关操作。netty5.0.0版本里,自定义拦截器可以实现我的需求,我也测试通过,具体就是继承ChannelHandlerAdapter类,实现父类的close方法,添加到ChannelPipeline里时,注意要添加到最前面。
wind_sizemore 2015-10-09
  • 打赏
  • 举报
回复
public class MyOutboundHandler extends ChannelHandlerAdapter { @Override public void close(ChannelHandlerContext ctx, ChannelPromise promise) throws Exception { System.out.println("close....."); } }
raoyao1987 2015-10-09
  • 打赏
  • 举报
回复
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
		Channel incoming = ctx.channel();
		if(!incoming.isActive())
		System.out.println("SimpleClient:" + incoming.remoteAddress()
				+ "异常");
	
		cause.printStackTrace();
		ctx.close();
	}
wind_sizemore 2015-10-08
  • 打赏
  • 举报
回复
刚接触netty,之前用mina,米那种有个sessionClose的方法,客户端断开在此方法里可以处理,netty有没有相关的功能

25,980

社区成员

发帖
与我相关
我的任务
社区描述
高性能WEB开发
社区管理员
  • 高性能WEB开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧