csusky

          常用鏈接

          統計

          最新評論

          2009年11月10日 #

          異步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 @ 2009-11-10 22:28 曉宇 閱讀(425) | 評論 (1)編輯 收藏

          主站蜘蛛池模板: 淄博市| 德江县| 山阳县| 福清市| 潼关县| 通辽市| 大连市| 西藏| 金沙县| 江永县| 寻乌县| 襄垣县| 祁阳县| 大安市| 新晃| 仁化县| 平舆县| 前郭尔| 高州市| 邢台市| 金沙县| 澎湖县| 儋州市| 临洮县| 孙吴县| 邓州市| 宝鸡市| 隆尧县| 博客| 尤溪县| 梅河口市| 永胜县| 嵩明县| 阳泉市| 伊宁市| 鹤山市| 石城县| 平乡县| 中江县| 乐陵市| 桦南县|