Connection reset by peer

912 阅读1分钟

异常: image.png 该异常在客户端和服务器端均有可能发生,引起该异常的原因有两个,

  • 第一个就是如果一端的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());  
        });  
    }  
}

image.png 有代码可知。客户端发送完消息后直接就关闭了。但是服务端还在返回消息。于是当服务器返回给客户端时,客户端返回RST

当加上Thread.Sleep(1000)后,就不会了。因为此时服务端已经返回完成。