csusky

          常用鏈接

          統(tǒng)計(jì)

          最新評(píng)論

          2009年11月10日 #

          異步IO的關(guān)閉事件

          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;

          是沒(méi)有關(guān)閉事件的,我們?cè)趺磁袛嘁粋€(gè)連接是否關(guān)閉呢?
          如果你的selector注冊(cè)了一個(gè)OP_READ事件,那么在連接關(guān)閉的時(shí)候?qū)?huì)產(chǎn)生一個(gè)OP_READ事件
          也就是說(shuō)本來(lái)阻塞的selector此時(shí)將會(huì)被喚醒,但是如果試圖在此事件的通道中讀取數(shù)據(jù)將會(huì)返回-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(); 
          //此時(shí)將會(huì)得到-1,表明該鏈接已關(guān)閉
          int n = incomingChannel.read(readBuffer);
          }
          此時(shí)我們需要取消該KEY 如下:
          if (n == -1)
                      
          {
                          key.cancel();
                            //關(guān)閉輸入輸出 
                            sc.socket().shutdownOutput();
                            sc.socket().shutdownInput();
                             //關(guān)閉SOCKET
                             sc.socket().close();
                            //關(guān)閉通道
                             incomingChannel.close();
                      }

          posted @ 2009-11-10 22:28 曉宇 閱讀(431) | 評(píng)論 (1)編輯 收藏

          主站蜘蛛池模板: 庆城县| 会东县| 陈巴尔虎旗| 建水县| 涪陵区| 梓潼县| 星座| 垣曲县| 南阳市| 新宾| 双城市| 金塔县| 太谷县| 拜城县| 汾西县| 苗栗县| 文山县| 钟山县| 开平市| 孙吴县| 准格尔旗| 潜山县| 凉城县| 巴南区| 和顺县| 沙洋县| 蛟河市| 嵩明县| 池州市| 延川县| 双鸭山市| 三台县| 沙雅县| 肥乡县| 利川市| 高雄市| 洛阳市| 宣威市| 巴塘县| 大渡口区| 临夏市|