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 曉宇 閱讀(430) 評論(1)  編輯  收藏 所屬分類: JAVA非阻塞編程

          評論

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

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


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


          網站導航:
           
          主站蜘蛛池模板: 个旧市| 长治市| 榆中县| 琼海市| 宣威市| 永康市| 新巴尔虎左旗| 洪泽县| 浦北县| 南涧| 石城县| 梁河县| 昭通市| 昭苏县| 清水县| 北宁市| 文成县| 呼玛县| 长葛市| 泰来县| 衡南县| 天台县| 玉龙| 合江县| 宣城市| 东丽区| 四会市| 德惠市| 保靖县| 修水县| 武安市| 雷山县| 洪洞县| 兴国县| 小金县| 垫江县| 商南县| 石林| 平定县| 原平市| 琼海市|