异常:
该异常在客户端和服务器端均有可能发生,引起该异常的原因有两个,
- 第一个就是如果一端的Socket被关闭(或主动关闭或者因为异常退出而引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer)。
- 另一个是一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connection reset)。简单的说就是在连接断开后的读和写操作引起的。
原文链接:blog.csdn.net/yyuggjggg/a…
@Slf4j
public class NattyDiscardHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg){
ByteBuf in = (ByteBuf)msg;
log.info(in.hasArray()?"堆内存":"直接内存");
// netty4.1默认直接内存,java不能直接操作,需要先读取bytes后才能操作
int len = in.readableBytes();
byte[] bytes = new byte[len];
// 使用getBytes不影响数据指针,readBytes会影响,会导致不能复用(影响后面的复用)
in.getBytes(0,bytes);
log.info("收到请求:" + new String(bytes, StandardCharsets.UTF_8));
log.info("写回前引用数:" + in.refCnt());
ChannelFuture channelFuture = ctx.writeAndFlush(msg);
channelFuture.addListener((listener)->{
log.info("写回后引用数:" + in.refCnt());
});
}
}
有代码可知。客户端发送完消息后直接就关闭了。但是服务端还在返回消息。于是当服务器返回给客户端时,客户端返回RST
当加上Thread.Sleep(1000)后,就不会了。因为此时服务端已经返回完成。