zoukankan      html  css  js  c++  java
  • Netty源码剖析-断开连接

    参考文献:极客时间傅健老师的《Netty源码剖析与实战》Talk is cheap.show me the code!

    ----主线:

    ----源码:

        在NioEventLoop的unsafe.read()打断点

     在客户端关闭的地方也加个断点,并且修改点代码:

     然后启动server和client;就会发现代码停在关闭的地方:

    当下一步的时候,则会来到最开始的断点:

     这个时候的unsafe就是NioSocketChannel,继续跟进并在下图的“doReadBytes()”打个断点:

     继续跟进:

     再进入writeBytes():

     

    这个时候writtenBytes=-1, -1表示正常关闭,然后返回-1;接着回去

    进入closeOnRead();

     再进入close();一直跟进后:

     这里this.outboundBuffer=nul;表示不接受消息,接着往下走有个doClose0();

    一直跟进去,直到看到javaChannel.close();

     这个其实就是调用jdk:

     再继续跟进:

     就是将SelectionKey从Selector上cancel掉,这样的话这个Selector上就不会发生这个Channel的event了!接着返回

     一直跟进:

     点进去不妨可以看出:

      

     它也做了一次cancel;

     跳转回来一次正常的关闭就结束了

    ----总结:

        连接关闭本质:

         java.nio.channels.spi.AbstractInterruptibleChannel#close;

          java.nio.channels.SelectionKey#cancel

        关闭连接,会触发OP_READ方法。读取字节数是-1代表关闭

        数据读取进行时,强行关闭,触发IO Exception,进而执行关闭

        Channel的关闭包含了SelectKey的cancel.

    我只想做的更好,仅此而已。

  • 相关阅读:
    《SQL Server 2000设计与T-SQL编程》
    sql语句优化 (转)
    SQL Server优化50法(转)
    (转)SQL 优化原则
    sql 锁
    后台服务标准化运营
    ReactNative For Android 框架启动核心路径剖析
    手机QQ会员H5加速方案——sonic技术内幕
    微信支付商户系统架构背后的故事
    [干货] 有了微信小程序,谁还学ReactNative?
  • 原文地址:https://www.cnblogs.com/-qilin/p/11820895.html
Copyright © 2011-2022 走看看