隨筆-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 小米 閱讀(3211) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 苏州市| 扶余县| 三河市| 隆昌县| 延边| 宁陵县| 从江县| 通化市| 汶上县| 灵武市| 邢台县| 云和县| 舟山市| 鄂州市| 南昌市| 上虞市| 绥滨县| 新蔡县| 东阿县| 长岭县| 永丰县| 长宁区| 连南| 沂水县| 本溪市| 定边县| 高唐县| 山西省| 临澧县| 明星| 沅江市| 泾川县| 靖江市| 习水县| 天祝| 吉水县| 镇远县| 马边| 龙泉市| 汝阳县| 微山县|