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方法。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM