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

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


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


          網站導航:
           
          主站蜘蛛池模板: 弋阳县| 冕宁县| 天柱县| 襄樊市| 潮安县| 萨嘎县| 甘泉县| 德惠市| 公安县| 抚州市| 琼结县| 遂宁市| 互助| 洛隆县| 巧家县| 松滋市| 驻马店市| 闽侯县| 安平县| 凤冈县| 平舆县| 曲周县| 苏尼特右旗| 色达县| 乐清市| 泾阳县| 南召县| 阳高县| 庆云县| 射洪县| 兰坪| 如皋市| 石柱| 青浦区| 揭阳市| 惠州市| 平远县| 马尔康县| 威信县| 黄平县| 衡阳县|