Java.nio中的主要類
ServerSocketChannel:ServerSocket的替代類.
SocketChannel:Socket的替代類
Selector:為ServerSocketChannel監(jiān)控接受就緒事件,為SocketChannel監(jiān)控連接就緒,讀就緒和寫就緒事件
SelectionKey:代表ServerSocketChannel及SocketChannel向Selector注冊事件句柄
向SocketChannel和ServerSocketChannel注冊事件:
SelectionKey key=serverSocketChannel.register(selector,op)
Op的可選值
對于ServerSocketChannel只有一個事件:
(1)SelectionKye.OP_ACCEPT:接受連接就緒事件,表示至少有了一個客戶連接,服務(wù)器可以接受這個連接
SocketChannel可能發(fā)生3種事件
(1)SelectionKey.OP_CONNECT:連接就為事件,表示客戶與服務(wù)器的連接已經(jīng)成功
(2)SelectionKey.OP_WRITE/OP_READ:寫的就緒事件,表示已經(jīng)可以向輸出流寫數(shù)據(jù)了SocketChannel提供了接受和發(fā)送的方法
可以使用:read(ByteBuffer)write(ByteBuffer)寫入寫出
?ServerSocketChannel類
方法:(PS繼承過SelectableChannel類的方法)
??? (1)open()靜態(tài)方法獲取ServerSocketChannel對象.
???? (2)accept同ServerSocket,不過獲取的是SocketChannel,根據(jù)是否阻塞返回null還是阻塞,值得注意的是accept返回的SocketChannel是阻塞模式的使用configureBlocking更改模式
???? (3)socket() 返回關(guān)聯(lián)的ServerSocket
SocketChannel類
此類是Socket類的替代類?
方法:(PS繼承過SelectableChannel類的方法)
(1)open() open(SocketAddress)靜態(tài)方法用來創(chuàng)建SocketChannel對象,第二個重寫還會建立于遠程服務(wù)器的連接.
(2)socket()返回關(guān)聯(lián)的Socket對象
(3)isConnected()是否建立連接
(4)isConnectionPending判斷是否正在進行遠程連接
(5)connect() 建立遠程連接() 根據(jù)是否阻塞而不同
(6)finishConnect() 視圖完成遠程連接?
(7)read()讀取數(shù)據(jù)(這個應(yīng)該是接數(shù)據(jù))
(8)write()寫數(shù)據(jù)(這個是發(fā)送數(shù)據(jù))
聲明:
public static int PORT = 8888;
ServerSocketChannel serverChannel;
ServerSocket serverSocket;
Selector selector;
?
初始化:
// 1. 分配一個 ServerSocketChannel 文件描述符
serverChannel = ServerSocketChannel.open();
// 2. 從 ServerSocketChannel里獲取一個對于的 socket
serverSocket = serverChannel.socket();
// 3. 生成一個 Selector
selector = Selector.open();
// 4. 把 socket 綁定到端口上
serverSocket.bind(new InetSocketAddress(iport));
// 5. serverChannel 未非bolck
serverChannel.configureBlocking(false);
// 6. 通過Selector注冊ServerSocketChannel: 只能注冊 accept
// 而SocketChannel可以注冊CONNENCT,READ,WRITE ; register -> validOps
// 在各個子類實現(xiàn)不同
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
?
開啟服務(wù):
while (true) {
try {
// 獲得IO準備就緒的channel數(shù)量
int n = selector.select();
// 沒有channel準備就緒,繼續(xù)執(zhí)行
if (n == 0) {
continue;
}
// 用一個iterator返回Selector的selectedkeys
Iterator it = selector.selectedKeys().iterator();
// 處理每一個SelectionKey
while (it.hasNext()) {
SelectionKey key = (SelectionKey) it.next();
// 判斷是否有新的連接到達
if (key.isAcceptable()) {
// 返回SelectionKey的ServerSocketChannel
ServerSocketChannel server = (ServerSocketChannel) key
.channel();
System.out.println("有連接");
SocketChannel channel = server.accept();
registerChannel(selector, channel, SelectionKey.OP_READ);
doWork(channel);
}
// 判斷是否有數(shù)據(jù)在此channel里需要讀取
if (key.isReadable()) {
processData(key);
}
}
// 刪除 selectedkeys
it.remove();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
?
已有 0 人發(fā)表留言,猛擊->>這里<<-參與討論
ITeye推薦