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

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

編輯:中級開發

有關android NIO的精髓主要用於高負載的Socket網絡傳輸,相對於傳統I/O模型的Socket傳輸方式的優勢,我們已經在 android開發進階之NIO非阻塞包(一) 中講到了,這裡不再贅述,一起來看看android NIO有關Socket操作提供的類吧:

  一、ServerSocketChannel 服務器套接字通道在android SDK中查找package名為  Java.nio.channels.ServerSocketChannel

   在Java的NIO中,ServerSocketChannel對應的是傳統IO中的ServerSocket,通過ServerSocketChannel類的socket() 方法可以獲得一個傳統的ServerSocket對象,同時從ServerSocket對象的getChannel() 方法,可以獲得一個ServerSocketChannel()對象,這點說明NIO的ServerSocketChannel和傳統IO的ServerSocket是有關聯的,實例化ServerSocketChannel 只需要直接調用ServerSocketChannel 類的靜態方法open()即可。

  二、 SocketChannel 套接字通道 Java.nio.channels.SocketChannel   

  在Java的New I/O中,處理Socket類對應的東西,我們可以看做是SocketChannel,套接字通道關聯了一個Socket類,這一點使用SocketChannel類的socket() 方法可以返回一個傳統IO的Socket類。SocketChannel()對象在Server中一般通過Socket類的getChannel()方法獲得。

 三、SelectionKey 選擇鍵 Java.nio.channels.SelectionKey

  在NIO中SelectionKey和Selector是最關鍵的地方,SelectionKey類中描述了NIO中比較重要的事件,比如OP_ACCEPT(用於服務器端)、OP_CONNECT(用於客戶端)、OP_READ和OP_WRITE。

 四、Selector 選擇器 Java.nio.channels.Selector

  在NIO中注冊各種事件的方法主要使用Selector來實現的,構造一個Selector對象,使用Selector類的靜態方法open()來實例化。

  對於android平台上我們實現一個非阻塞的服務器,過程如下:

   1. 通過Selector類的open()靜態方法實例化一個Selector對象。

   2. 通過ServerSocketChannel類的open()靜態方法實例化一個ServerSocketChannel對象。

   3. 顯示的調用ServerSocketChannel對象的configureBlocking(false);方法,設置為非阻塞模式,android123提示網友這一步十分重要。

   4. 使用ServerSocketChannel對象的socket()方法返回一個ServerSocket對象,使用ServerSocket對象的bind()方法綁定一個IP地址和端口號

   5. 調用ServerSocketChannel對象的register方法注冊感興趣的網絡事件,很多開發者可能發現Android SDK文檔中沒有看到register方法,這裡android開發網給大家一個ServerSocketChannel類的繼承關系  

Java.lang.Object    ↳ Java.nio.channels.spi.AbstractInterruptibleChannel      ↳ Java.nio.channels.SelectableChannel        ↳ Java.nio.channels.spi.AbstractSelectableChannel          ↳ Java.nio.channels.ServerSocketChannel

   這裡我們使用的register方法其實來自ServerSocketChannel的父類Java.nio.channels.SelectableChannel,該方法原型為 final SelectionKey  register(Selector selector, int Operations)  ,參數為我們執行第1步時的selector對象,參數二為需要注冊的事件,作為服務器,我們當然是接受客戶端發來的請求,所以這裡使用SelectionKey.OP_ACCEPT了。

  6. 通過Selector對象的select() 方法判斷是否有我們感興趣的事件發生,這裡就是OP_ACCEPT事件了。我們通過一個死循環獲取Selector對象執行select()方法的值,SDK中的原始描述為the number of channels that are ready for Operation.,就是到底有多少個通道返回。

  7. 如果 Selector對象的select()方法返回的結果數大於0,則通過selector對象的selectedKeys()方法獲取一個SelectionKey類型的Set集合,我們使用Java的迭代器Iterator類來遍歷這個Set集合,注意判斷SelectionKey對象,

  8. 為了表示我們處理了SelectionKey對象,需要先移除這個SelectionKey對象從Set集合中。這句很關鍵android 123提醒網友注意這個地方。

  9. 接下來判斷SelectionKey對象的事件,因為我們注冊的感興趣的是SelectionKey.OP_ACCEPT事件,我們使用SelectionKey對象的isAcceptable()方法判斷,如果是我們創建一個臨時SocketChannel對象類似上面的方法繼續處理,不過這時這個SocketChannel對象主要處理讀寫操作,我們注冊SelectionKey.OP_READ和SelectionKey.OP_WRITE分配ByteBuffer緩沖區,進行網絡數據傳輸。

  有關具體的示例和解釋上面的流暢,由於篇幅原因我們明天android開發網給出源代碼,做詳細的分析。

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