<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      網(wǎng)絡(luò)編程-關(guān)閉連接(2)-Java的NIO在關(guān)閉socket時,究竟用了哪個系統(tǒng)調(diào)用函數(shù)?

      背景

      在上一講網(wǎng)絡(luò)編程-關(guān)閉連接-C/C++相關(guān)系統(tǒng)調(diào)用中,提到過,目前項目使用Netty框架來實現(xiàn)的網(wǎng)絡(luò)編程,查看netty源碼可以得知,netty最終是調(diào)用了java Nio的close接口做的關(guān)閉操作,那么想研究清楚這個close操作究竟做了什么,可以從兩個方向入手,這兩個方向也是從下至上的。

      1. 搞清楚如果使用C/C++編程,應該調(diào)用哪個系統(tǒng)調(diào)用函數(shù)?函數(shù)內(nèi)部做了什么,涉及到什么TCP/IP的協(xié)議參數(shù),這些已經(jīng)在上一講中研究明白了。
      2. 搞清楚java nio在調(diào)用close方法時,究竟使用了哪個系統(tǒng)調(diào)用?

      這一講,主要研究解決第二個問題,搞清楚java nio在調(diào)用close方法時,究竟使用了哪個系統(tǒng)調(diào)用?

      實驗

      在實驗中,我們會使用linux下的strace工具,來跟蹤系統(tǒng)調(diào)用。

      使用我們的測試代碼,用netty框架搭建了一個客戶端,其中通過web接口傳入ip端口進行連接,連接成功以后,在channelActive回調(diào)方法中先調(diào)用一個寫文件方法,然后關(guān)閉channel。

      測試代碼上傳到github上:

      部分關(guān)鍵代碼如圖:

      @Override
          public void channelActive(ChannelHandlerContext ctx) throws Exception {
              //寫入本地文件測試字符,然后關(guān)閉channel
              FileWriter fileWriter = new FileWriter("/root/test.txt");
              fileWriter.write("test test hold on");
              fileWriter.flush();
              fileWriter.close();
      
              //調(diào)用同步方法關(guān)閉
              ChannelFuture sync = ctx.channel().close().sync();
              if(sync.isSuccess()){
                  System.out.println("關(guān)閉成功!");
              }else{
                  System.out.println("關(guān)閉失敗!");
              }
      }
      

      在linux虛擬機上,使用下面指令運行該程序

      [root@localhost Downloads]# java -jar pro-test-demo-0.0.1-SNAPSHOT.jar 
      

      然后使用ps -ef | grep "java"得到該進程的pid。

      [root@localhost Downloads]# ps -ef | grep "java"
      root       3029   2940 31 13:48 pts/0    00:00:13 java -jar pro-test-demo-0.0.1-SNAPSHOT.jar
      root       3136   3101  0 13:49 pts/2    00:00:00 grep --color=auto java
      

      使用strace跟蹤系統(tǒng)調(diào)用,命令如下:

      strace -tt -T -f -v -e trace=all -p 3029 -o ouput.log
      

      java程序運行起來如下,我們使用postman傳遞了ip和端口,看到日志輸出為連接成功,并且輸出關(guān)閉成功!

      [root@localhost Downloads]# java -jar pro-test-demo-0.0.1-SNAPSHOT.jar 
      
        .   ____          _            __ _ _
       /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
      ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
       \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
        '  |____| .__|_| |_|_| |_\__, | / / / /
       =========|_|==============|___/=/_/_/_/
       :: Spring Boot ::        (v2.1.4.RELEASE)
      
      2020-07-14 13:48:52.225  INFO 3029 --- [           main] c.n.icomp.protestdemo.jfdj.NettyClient   : Starting NettyClient v0.0.1-SNAPSHOT on localhost.localdomain with PID 3029 (/root/Downloads/pro-test-demo-0.0.1-SNAPSHOT.jar started by root in /root/Downloads)
      2020-07-14 13:48:52.229  INFO 3029 --- [           main] c.n.icomp.protestdemo.jfdj.NettyClient   : No active profile set, falling back to default profiles: default
      2020-07-14 13:48:53.608  INFO 3029 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!
      2020-07-14 13:48:53.618  INFO 3029 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data repositories in DEFAULT mode.
      2020-07-14 13:48:53.694  INFO 3029 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 55ms. Found 0 repository interfaces.
      2020-07-14 13:48:54.374  INFO 3029 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 9876 (http)
      2020-07-14 13:48:54.410  INFO 3029 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
      2020-07-14 13:48:54.410  INFO 3029 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.17]
      2020-07-14 13:48:54.504  INFO 3029 --- [           main] o.a.c.c.C.[.[localhost].[/protest]       : Initializing Spring embedded WebApplicationContext
      2020-07-14 13:48:54.504  INFO 3029 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 2187 ms
      2020-07-14 13:48:55.144  INFO 3029 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
      2020-07-14 13:48:55.434  INFO 3029 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 9876 (http) with context path '/protest'
      2020-07-14 13:48:55.436  INFO 3029 --- [           main] c.n.icomp.protestdemo.jfdj.NettyClient   : Started NettyClient in 3.968 seconds (JVM running for 4.79)
      2020-07-14 13:50:10.685  INFO 3029 --- [nio-9876-exec-1] o.a.c.c.C.[.[localhost].[/protest]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
      2020-07-14 13:50:10.685  INFO 3029 --- [nio-9876-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
      2020-07-14 13:50:10.691  INFO 3029 --- [nio-9876-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 6 ms
      接收到參數(shù):{"ip":"10.43.11.240","port":"20108"}
      連接成功!
      關(guān)閉成功!
      

      最后打開output.log查看系統(tǒng)調(diào)用
      為了便于我搜索,我提前在代碼中加入了關(guān)鍵的一行

      fileWriter.write("test test hold on");
      

      所以搜索的時候,可以先搜索test test hold on,找到對應寫入的系統(tǒng)調(diào)用,附近應該就是close相關(guān)的系統(tǒng)調(diào)用了。

      3494  13:53:04.722628 write(103, "test test hold on", 17) = 17 <0.000060>
      3494  13:53:04.722755 close(103)        = 0 <0.000251>
      3494  13:53:04.723141 getsockopt(102, SOL_SOCKET, SO_LINGER, {l_onoff=0, l_linger=0}, [8]) = 0 <0.000080>
      
      3499  13:53:17.206962 close(102)        = 0 <0.000012>
      

      可以發(fā)現(xiàn),fd為102的socket就是我們需要檢測的socket,在調(diào)用close真正關(guān)閉之前,還進行了獲取SO_LINGER的系統(tǒng)調(diào)用getsockopt,并且l_onoff=0, l_linger=0,會關(guān)閉讀寫兩方向連接,并且在后臺繼續(xù)發(fā)送發(fā)送緩沖區(qū)中的內(nèi)容,后面調(diào)用close返回0,代表成功。

      總結(jié)

      JAVA nio的close操作,使用的是close系統(tǒng)調(diào)用。關(guān)于close系統(tǒng)調(diào)用,可以參考上一講中的內(nèi)容。網(wǎng)絡(luò)編程-關(guān)閉連接-C/C++相關(guān)系統(tǒng)調(diào)用

      posted @ 2020-08-10 09:28  Ging  閱讀(522)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲国产日韩a在线播放| 亚洲欧美日韩愉拍自拍美利坚| 被黑人巨大一区二区三区| 日本三级香港三级三级人妇久 | 国产亚洲亚洲国产一二区| 激情综合色综合啪啪开心| AV人摸人人人澡人人超碰| 日本韩国一区二区精品| 少妇太爽了在线观看免费视频| 永久免费无码网站在线观看| av无码久久久久不卡网站蜜桃| 久久人与动人物a级毛片| 在线欧美中文字幕农村电影| 玉田县| 色一情一乱一区二区三区码| 免费VA国产高清大片在线| 安达市| 国产日产亚洲系列av| 老司机精品成人无码AV| 粗壮挺进人妻水蜜桃成熟| 亚洲综合久久精品哦夜夜嗨| 国产 亚洲 制服 无码 中文 | 67194熟妇在线观看线路| 亚洲中文字幕成人综合网| 偷拍一区二区三区在线视频| 67194熟妇在线观看线路| 人妻少妇久久中文字幕| 国产成人99亚洲综合精品| 欧美激欧美啪啪片| 在线亚洲午夜片av大片| 久久大香伊蕉在人线免费AV| 午夜三级成人在线观看| 国产区一区二区现看视频| 综合激情网一区二区三区| 色综合 图片区 小说区| 国内精品自线在拍| 中文字幕国产精品日韩| 一本大道色婷婷在线| 热久在线免费观看视频| 国产乱人伦真实精品视频| 久久青青草原亚洲AV无码麻豆|