csusky

          常用鏈接

          統計

          最新評論

          異步IO的關閉事件

          JAVA SOCKET只定義了四種事件

          public static final int OP_READ = 1 << 0;
          public static final int OP_WRITE = 1 << 2;
          public static final int OP_CONNECT = 1 << 3;
          public static final int OP_ACCEPT = 1 << 4;

          是沒有關閉事件的,我們怎么判斷一個連接是否關閉呢?
          如果你的selector注冊了一個OP_READ事件,那么在連接關閉的時候將會產生一個OP_READ事件
          也就是說本來阻塞的selector此時將會被喚醒,但是如果試圖在此事件的通道中讀取數據將會返回-1
          如下:

          Set<SelectionKey> readyKeys = selector.selectedKeys();

          = readyKeys.iterator()

          SelectionKey key 
          = (SelectionKey)i.next();

          if (operation == SelectionKey.OP_READ &&
                                   key.isReadable())
                          
          {
                              ReadableByteChannel incomingChannel 
          = (ReadableByteChannel)key.channel(); 
          //此時將會得到-1,表明該鏈接已關閉
          int n = incomingChannel.read(readBuffer);
          }
          此時我們需要取消該KEY 如下:
          if (n == -1)
                      
          {
                          key.cancel();
                            //關閉輸入輸出 
                            sc.socket().shutdownOutput();
                            sc.socket().shutdownInput();
                             //關閉SOCKET
                             sc.socket().close();
                            //關閉通道
                             incomingChannel.close();
                      }

          posted on 2009-11-10 22:28 曉宇 閱讀(431) 評論(1)  編輯  收藏 所屬分類: JAVA非阻塞編程

          評論

          # re: 異步IO的關閉事件 2009-11-12 23:31 daimojingdeyu

          好文,幫助很大,就是如何判斷通道關閉了  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 进贤县| 边坝县| 灵丘县| 突泉县| 盱眙县| 互助| 定州市| 临邑县| 渭南市| 安溪县| 阳朔县| 永济市| 饶河县| 宜春市| 石城县| 木兰县| 土默特右旗| 天峻县| 高尔夫| 阿城市| 扎赉特旗| 罗城| 江北区| 舒兰市| 岫岩| 惠水县| 砀山县| 阿克| 淳安县| 班玛县| 龙井市| 晴隆县| 容城县| 台州市| 吴旗县| 香河县| 彭水| 门源| 玉屏| 云龙县| 库车县|