Netty调用channel.close方法和 客户端所在Java进程正常/异常关闭的细节

close方法中,客户端发出正常的挥手请求,在服务端的AbstractNioByteChannel的内部类NioByteUnsafe的read方法中,close = allocHandle.lastBytesRead() < 0这句为true,就不会进入channelRead而是进入if (close) {closeOnRead(pipeline);}----close(voidPromise())----doClose0 + fireChannelInactiveAndDeregister----执行pipeline里面的inactive和unregister方法。

而客户端所在Java进程正常/异常关闭,客户端来不及发出挥手请求,发出的是RST复位请求,服务端在刚才说的unsafe.read方法中doReadBytes(byteBuf)这句直接抛出I/O异常,被捕捉后进入handleReadException方法,在方法中有fireExceptionCaught调用pipeline的exceptionCaught方法,而fireExceptionCaught下面还有之前说的closeOnRead,执行pipeline里面的inactive和unregister方法。

原文地址:https://www.cnblogs.com/chuliang/p/13534955.html