Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 中級開發 >> Android開發進階之NIO非阻塞包(四)

Android開發進階之NIO非阻塞包(四)

編輯:中級開發

今天我們通過一個實例詳細講解下Android下NIO非阻塞服務器的開發,對於客戶端而言android123不推薦使用NIO,畢竟NIO相對於傳統IO較為復雜,最重要的NIO是為了解決多線程並發問題而解決的技術,可能會因為管理和復雜性降低最終的結果,畢竟NIO是Java的,相關的類型比較難控制,對於客戶端而言我們可以使用C++、Java、C#甚至Flash Action Script來編寫。

    下面我們以一個簡單的Echo Server為例子來分析

 import Java.io.IOException;
import Java.Net.InetSocketAddress;
import Java.nio.ByteBuffer;
import Java.nio.CharBuffer;
import Java.nio.channels.SelectionKey;
import Java.nio.channels.Selector;
import Java.nio.channels.ServerSocketChannel;
import Java.nio.channels.SocketChannel;
import Java.nio.charset.Charset;
import Java.nio.charset.CharsetDecoder;
import Java.nio.charset.CharsetEncoder;
import Java.util.Iterator;

public class Server {

 public static void main(String[] args) {
  Selector selector = null;
  ServerSocketChannel ssc = null;
  try {
      selector = Selector.open(); //實例化selector
      ssc = ServerSocketChannel.open(); //實例化ServerSocketChannel 對象

      ssc.socket().bind(new InetSocketAddress(1987)); //綁定端口為1987

      ssc.configureBlocking(false); //設置為非阻塞模式
      ssc.register(selector, SelectionKey.OP_ACCEPT); //注冊關心的事件,對於Server來說主要是accpet了


   while (true) {
   int n= selector.select(); //獲取感興趣的selector數量
   if(n<1)
          continue; //如果沒有則一直輪訓檢查
    Iterator<SelectionKey> it = selector.selectedKeys().iterator(); //有新的鏈接,我們返回一個SelectionKey集合
    while (it.hasNext()) {
     SelectionKey key = it.next(); //使用迭代器遍歷
     it.remove(); //刪除迭代器

     if (key.isAcceptable()) { //如果是我們注冊的OP_ACCEPT事件
      ServerSocketChannel ssc2 = (ServerSocketChannel) key.channel();
      SocketChannel channel = ssc2.accept();
      channel.configureBlocking(false); //同樣是非阻塞
      channel.register(selector, SelectionKey.OP_READ); //本次注冊的是read事件,即receive接受

      System.out.println("CWJ ClIEnt :" + channel.socket().getInetAddress().getHostName() + ":"  + channel.socket().getPort());
     }

    else if (key.isReadable()) { //如果為讀事件

      SocketChannel channel = (SocketChannel) key.channel();

      ByteBuffer buffer = ByteBuffer.allocate(1024); //1KB的緩沖區
      channel.read(buffer); //讀取到緩沖區
      buffer.flip(); //准備寫入
      System.out.println("android123 receive info:" + buffer.toString());

      channel.write(CharBuffer.wrap("it works".getBytes())); //返回給客戶端
     }
    }
   }
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   try {
    selector.close();
    server.close();
   } catch (IOException e) {
   }
  }
 }
}

 上面是比較簡單的框架,裡面存在很多問題,android123將在下次詳細闡述下,上面或者說國內有關NIO資料中的通病,如果你看過Mina或GlassFish的源碼,你可能就知道上面的問題大於10種,有關框架的bug占了大多數,作為服務器而言很容易CPU超過100%

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved