編輯:高級開發
一、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開發網給出源代碼,做詳細的分析。
曾經,我們暢想過android版本的Firefox在技術層面已經沒有障礙,而近日,Mozilla的CEO John Lilly和Mobile for Mozilla主席
2009年9月16日android 1.6 Donut 發布谷歌已經發布了android SDK 1.6r1版本,也就是Donut 1.6版,通過此版本可以讓開發商快速
tp://images.cnblogs.com/cnblogs_com/phinecos/20080415/2009082805.jpg border=0 alt= w
不久前51CTO對國內的移動廣告平台進行一個詳細的介紹,對哇棒(wooboo)、架勢(casee)、有米(youmi)、微雲各平台的優劣都做了評估。本文將對各個平台做一