編輯:中級開發
一、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開發網給出源代碼,做詳細的分析。
簡介: BFS 是一款專門為 Linux 桌面環境所設計的內核調度器,它基於 Staircase Deadline 和 EEVDF 算法,支持 Linux 2
本文節選於機械工業出版社推出的《Android應用開發揭秘》一書,作者為楊豐盛。本書內容全面,詳細講解了Android框架、android組件、用戶界面開發、游戲開發、
簡介: 本文詳細介紹了 Android 應用編程中 Activity 的生命周期、通信方式和 Intent Filter 等內容,並提供了一些日常開發中經常用
(2) RelativeLayout相對布局,它是依靠與父容器,同一容器中其它控件的相對位置來排列顯示的。主要常用的屬性如下:相對父容器的屬性:android:layo