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

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


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


          網站導航:
           
          主站蜘蛛池模板: 叶城县| 墨江| 蓬安县| 公主岭市| 增城市| 界首市| 道真| 临颍县| 敦煌市| 玉山县| 宜黄县| 余庆县| 浦北县| 科尔| 宣威市| 军事| 元氏县| 侯马市| 花莲市| 美姑县| 南平市| 读书| 沅江市| 黑河市| 榆中县| 新余市| 康马县| 修水县| 左权县| 湘阴县| 侯马市| 樟树市| 康马县| 乌恰县| 津南区| 汾西县| 潜山县| 肥东县| 隆回县| 德兴市| 吉林省|