隨筆-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
          主站蜘蛛池模板: 北安市| 永宁县| 北京市| 思茅市| 邯郸市| 内黄县| 岳西县| 牡丹江市| 松阳县| 灯塔市| 正宁县| 斗六市| 谷城县| 青浦区| 临泽县| 海安县| 九寨沟县| 三明市| 喀什市| 莒南县| 黄大仙区| 潮安县| 察雅县| 多伦县| 莆田市| 福贡县| 乌恰县| 祁门县| 宿迁市| 竹山县| 平果县| 巧家县| 和政县| 遵化市| 温宿县| 宁明县| 敦化市| 吴桥县| 若尔盖县| 沂水县| 嘉义市|