首先了解下所謂的java nio是個什麼東西!
傳統的並發型服務器設計是利用阻塞型網絡I/O 以多線程的模式來實現的
於系統常常在進行網絡讀寫時處於阻塞狀態
了NIO(新I/O) API
型服務器程序提供了一個很好的解決方案
首先來看下傳統的阻塞型網絡 I/O的不足
Java 平台傳統的I/O 系統都是基於Byte(字節)和Stream(數據流)的
作都是阻塞型的
長連接模式來討論並發型服務器的相關設計
個單獨的主線程來監聽用戶發起的連接請求
程序都會啟一個新的線程來統一處理用戶數據的讀
這種模式的優點是簡單
戶端分配一個線程來處理輸入
數量的不斷增加
成為吞吐量瓶頸的主要原因
理粒度是以服務於請求的線程為單位的
資源利用率不高
對於並發型服務器
存中處理數據的時間
後推出的NIO 工具包
了可實現的基礎機制
NIO 包及工作原理
針對傳統I/O 工作模式的不足
道)
SelectionKey(選擇鍵)配合起來使用
NIO 工具包的成員
Buffer(緩沖器)
Buffer 類是一個抽象類
CharBuffer
對象相當於一個數據容器
類型(boolean 型除外)的數據
的操作
Channel(通道)
Channel 被認為是NIO 工具包的一大創新點
具有雙向性
ServerSocketChannel 和SocketChannel
分別可以工作在同步和異步兩種方式下(這裡的可選擇不是指可以選擇兩種工作方式
指可以有選擇的注冊自己感興趣的事件)
與傳統的ServerSocket
理不必等到輸入輸出完畢才返回
操作
持和管理並發的網絡套接字連接
Selector(選擇器)和SelectionKey(選擇鍵)
各類 Buffer 是數據的容器對象
數據
到Selector 對象上
SelectionKey 類則封裝了SelectableChannel 對象在Selector 中的注冊信息
到在某個注冊的SelectableChannel 上發生了感興趣的事件時
對象
SelectionKey 的分析
處理
NIO 工作原理
通過上面的討論
件驅動模型實現的
其注冊到特定的Selector 對象上
絡連接
成即可返回
當有讀或寫等任何注冊的事件發生時
SelectionKey
SelectableChannel
發機制
寫
好
並發型服務器程序的實現代碼
應用 NIO 工具包
實現程序有很大不同
是由程序員控制的
程序的核心代碼片段
import java
import
import java
import java
public class TestServer implements Runnable
{
/**
* 服務器Channel對象
*/
private ServerSocketChannel server
/**
* Selector對象
*/
private Selector selector
/**
* 總的活動連接數
*/
private int activeSockets
/**
* 服務器Channel綁定的端口號
*/
private int port
/**
*
* 構造函數
*/
public TestServer()throws IOException
{
activeSockets=
port=
selector= Selector
server=ServerSocketChannel
ServerSocket socket=server
socket
nfigureBlocking(false)
server
Selector對象
}
public void run()
{
while(true)
{
try
{
/**
*應用Select機制輪循是否有用戶感興趣的新的網絡事件發生
* 新的網絡事件發生時
*/
selector
}
catch(IOException e)
{
continue
}
/**
* 得到活動的網絡連接選擇鍵的集合
*/
Set<SelectionKey> keys=selector
activeSockets=keys
if(activeSockets==
{
continue
}
/**
/**
* 應用For—Each循環遍歷整個選擇鍵集合
*/
for(SelectionKey key :keys)
{
/**
* 如果關鍵字狀態是為可接受
事件
*/
if(key
{
doServerSocketEvent(key)
continue
}
/**
* 如果關鍵字狀態為可讀
* 進行相應的讀取客戶端數據的操作
*/
if(key
{
doClientReadEvent(key)
continue
}
/**
* 如果關鍵字狀態為可寫
* 進行相應的向客戶端寫數據的操作
*/
if(key
{
doClinetWriteEvent(key)
continue
}
}
}
}
/**
* 處理服務器事件操作
* @param key 服務器選擇鍵對象
*/
private void doServerSocketEvent(SelectionKey key)
{
SocketChannel client=null
try
{
ServerSocketChannel server=(ServerSocketChannel)key
client=server
if(client==null)
{
return
}
nfigureBlocking(false)
/**
/**
* 將客戶端Channel注冊到Selector對象上
* 興趣的事件為可讀和可寫
*/
client
}catch(IOException e)
{
try
{
client
}catch(IOException e
}
}
/**
* 進行向客戶端寫數據操作
* @param key 客戶端選擇鍵對象
*/
private void doClinetWriteEvent(SelectionKey key)
{
代碼實現略
}
/**
* 進行讀取客戶短數據操作
* @param key 客戶端選擇鍵對象
*/
private void doClientReadEvent(SelectionKey key)
{
代碼實現略
}
}
從上面對代碼可以看出
向Selector對象注冊感興趣的事件
行相應的處理
結語
通過使用NIO 工具包進行並發型服務器程序設計
以處理成千上萬個活動的Socket 連接
非阻塞模式
CPU 傳遞數據進行處理
看到這裡相信你看了不止
好了
下次給大家帶來一個java nio開發的實例吧~~
From:http://tw.wingwit.com/Article/program/Java/hx/201311/27190.html