隨筆-57  評論-202  文章-17  trackbacks-0
                從對象池中獲取的實例,因為并不清楚該channel是否已經設置成正確的狀態,所以在使用時最好重新設置一遍。有以下幾點需要注意:
                1.在使用阻塞IO時,需要把該channel設置成阻塞的,即需要調用SocketChannel.configureBlocking(true);
                2.在使用非阻塞IO時,需要把該channel設置成非阻塞的,即需要調用SocketChannel.configureBlocking(false);
                3.如果該channel注冊了selector,那么在返回該實例到對象池中,需要把注冊的selector清除,即需要調用Selector的close方法。

                下面是一段應用場景的例子:


                  
          // 把命令輸出
                  channel.configureBlocking(true);
                  PrintWriter writer 
          = new PrintWriter(channel.socket().getOutputStream(), false);
                  writer.write(command.endsWith(
          "\n"? command : command + "\n");
                  writer.flush();

                  channel.configureBlocking(
          false);

                  
          // 創建Selector
                  Selector selector = Selector.open();
                  
          // 向Selector注冊我們需要的READ事件
                  SelectionKey skey = channel.register(selector, SelectionKey.OP_READ);

                  boolean stop 
          = false;
                  
          int n = 0;
                  
          int read = 0;
                  ByteBuffer buffer 
          = ByteBuffer.allocate(1024);

                  
          // 輪詢
                  while (!stop) {
                    
          // 獲取Selector返回的時間值
                    n = selector.select();

                    
          // 當傳回的值大于0事,讀事件發生了
                    if (n > 0{
                   
          // 處理發生的事件
                   
                    }

                  }


                  selector.close();
          posted on 2005-05-25 15:02 小米 閱讀(3202) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 青浦区| 哈密市| 紫云| 连城县| 武宣县| 通渭县| 克什克腾旗| 土默特右旗| 平罗县| 曲松县| 民县| 库车县| 姚安县| 石景山区| 开阳县| 巢湖市| 教育| 嘉定区| 富川| 金华市| 松潘县| 库伦旗| 兴业县| 西乌| 南陵县| 普兰店市| 绵竹市| 卓尼县| 高台县| 定兴县| 高雄县| 手机| 博湖县| 开江县| 梓潼县| 丰镇市| 观塘区| 沁阳市| 阿拉善右旗| 安乡县| 徐州市|