1. 程式人生 > >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開發NIO阻塞()

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

Android開發NIO阻塞(二)

有關Android NIO我們主要分為三大類,ByteBuffer、FileChannel和SocketChannel。由於篇幅原因今天Android123只對前兩個做說明。NIO和傳統的I/O比較大的區別在於傳輸方式非阻塞,一種基於事件驅動的模式,將會使方法執行完後立即返回

Netty基礎篇NIO 阻塞通訊(6)

1、Tcp網路非阻塞通訊 //客戶端 @Test public void client() throws IOExcept

Android 動畫動畫切換

ram 屏幕 pre 退出 tac 旋轉動畫 utf 轉動 XML 一、Activity切換動畫   在Android開發中,經常會遇到Activity之間切換效果,下面介紹一下,Activity左右滑動切換效果。在Android2.0以後版本,在Activity中添加了

Java開發

為我 變量 kafka 自然 ges 想想 javaweb 目前 沒有 背景一 我接觸Java開發已經一年多了了。 從剛開始生澀地接觸語法,惹得編譯器報各種語法錯誤;到接觸OOD的思想,封裝、繼承、多態,懵懵懂懂地聽說著它們;再到學習Web開發,想著這些也許並不重要,實際用

Python學習----第七模塊筆記(Web開發Django數據庫操作)

long 機制 idt 4.5 gen git 表之間 protoc 小數 4、Django ORM 4.1、連接數據庫 創建Django工程後運行該工程,會在工程根目錄下創建db.sqlite3文件,為Django自帶的sqlite3數據庫(Django自帶的功能也需要數

Android高階自定義View

前言 在網上看到一張圖,花了些時間自己嘗試著寫了一個自定義View,裡面涉及到了自定義屬性、自定義View padding屬性的處理、畫筆(Paint)和畫布(Canvas)的使用、解析度適配問題、效能問題、屬性動畫等,覺得還是有些東西值的記錄一下的,效果圖如下: 自定義屬

Android開發——使用Dagger2

前言 關於Dagger2的學習,首先看的官方文件,確實看不懂。然後搜尋網路上的介紹博文,不乏一些講得比較好的,如這個。但終究不夠透徹,還是得回頭研究官方文件。本文不僅僅是翻譯,而是記錄了自己對官方文件的理解。 提供依賴的兩種方式 使用@Inject註解構造器 class

Android開發——測試

導言 每次使用Android Studio建立一個新的工程,都會看到類似如下的目錄結構: 我們編寫的Java程式碼全部放在最上面的包中,下面兩個使用紅線圈中的包總是沒有用過,僅僅知道他們是用於放置測試程式碼的。標註為androidTest的包放置UI相關的測試,標註為test

HenCoder Android 開發: 自定義 View 1-1 繪製基礎

自定義繪製概述 二話不說,我反手就是一個視訊:(視訊掛了,先直接點到優酷去看吧:優酷連結) 首先總結一下視訊中的關鍵點: 自定義繪製的方式是重寫繪製方法,其中最常用的是 onDraw() 繪製的關鍵是 Canvas 的使用 Canvas 的繪製類方法: drawXX

Android高階 TextInputLayout用法

TextInputLayout見名知義與文字輸入有關係,TextInputLayout控制元件通過內嵌EditText來實現輸入文字時,根據預先設定的屬性向使用者展示相應的提醒文字並附有酷炫的動畫效果。例如,當文字框裡的字元長度大於10的時候自動給使用者提示,無需編寫額外的程

安卓開發RxJava在實際專案中使用--第二篇

關於RxJava原理分析,請參考仍物線寫的文章—-給 Android 開發者的 RxJava 詳解。本文不對原理作過多的分析,從最快上手的角度,讓開發者使用起來,當我們有實踐經驗後回過頭來看原理分析會更清晰。 本系列共有三篇文章,分別關於Rxjava的基礎使用

前端工程師開發

var str="www.baidu.com/?page"; // 1、字串剪裁 str.substring(0, str.indexof("?page")); // 2、正則表示式 str.replace(/?page/, ""); // 3、字串分拆、合併 str.split("?page").join(

指尖上行--移動前端開發路(讀書筆記)----1.1頁面佈局

chapter 1 移動頁面開發 頁面佈局 頁面除錯 常用庫和框架 1.1 頁面佈局 1.1.1 Vieport(視口,檢視視窗) 裝置畫素 物理畫素:螢幕解析度; 裝置獨立畫素:CSS畫素(eg:IPhone5 CSS畫素是320*568p

Android開發:Activity和程序的回收和狀態恢復

不管是安卓的官方文件還是原始碼註釋,處處可見“從 Activity A 跳到 Activity B,當系統記憶體不足時 A 可能會被回收……”,而且沒有明確說明 A 和 B 是否屬於同一個 app 或程序。 但是,在官方給的 Activity 生命週期圖中

Android開發-:Json字串轉換為java物件的各種實現方法[json_lib框架、Gson、org.json]

JSON (JavaScript Object Notation) 是一種輕量級的資料交換格式。易於人閱讀和編寫。同時也易於機器解析和生成。它基於JavaScript Programming Language, Standard ECMA-262 3rd Edition

指尖上行--移動前端開發路(讀書筆記)----2.1動畫形式

chapter 2 技術創意形式 動畫形式 移動裝置 Web API 詳解 WebVR 創意點 2.1 動畫形式 2.1.1 CSS3 CSS3 Cascading Style Sheets 層疊樣式表。 CSS3是CSS技術的一個升級版本,

一、web專案開發分模組管理專案通用模組

  以前的web專案都是統一一個工程,其他人員在這個專案拉取分支進行開發,但是若需要多個人協作同時進行開發時,會造成各種各樣的問題。為了解決這些問題,按照業務邏輯進行區分,將一個專案按照多個模組進行構建。 (一)所有專案的父模組“parent”   父模組的

指尖上行--移動前端開發路(讀書筆記)----1.3常用庫和框架

chapter 1 移動頁面開發 頁面佈局 頁面除錯 常用庫和框架 1.3 常用庫和框架 1.3.1 jQuery Mobile jQuery Mobile是jQuery 框架的一個元件(而非jquery的移動版本)。這個框架已經很老了,本人

大資料開發HBase開發例項介紹

這周學習了HBase的開發例項,主要有一些HBase API的使用。(文中的程式碼,是經過實際執行有效的,只擷取片段,關於全部的可參考前一篇文章中全域性變數的設定,關於執行環境也與前一篇一樣) 一、HBase基本操作 1.追加插入-Append 在原有的value中追加值,