nio的应用 java_Java NIO 在网络编程中的应用
事實上Java nio引入了異步機(jī)制,異步I/O 在Linux上有 select poll epoll,支持多路復(fù)用。在Java里就是通過nio的一整套類來實現(xiàn)的,主要有:
ByteBuffer
SocketChannel
ServerSocketChannel
Selector
SelectionKey
注冊:
channel調(diào)用 register來向selector注冊,
移除:
SelectionKey.cancel //僅僅把selectionkey 對應(yīng)的channel從selector中移除,socket仍然處于活動狀態(tài),需要手動關(guān)閉。
channel.close()//從selector移除,加關(guān)閉channel關(guān)聯(lián)的socket對象
//得到一個selector
Selector select = Selector.open();
ServerSocketChannel ss = ServerSocketChannel.open();
//必須配置成non-blocking
ss.configureBlocking(false);
//綁定到一個地址
ss.socket().bind( new InetSocketAddress("0.0.0.0", 5858));
//把channel注冊selector,此時會有一個SelectionKey跟這個channel關(guān)聯(lián)
//當(dāng)有連接進(jìn)來時,select可以返回selectedKeys
ss.register(select, SelectionKey.OP_ACCEPT);
while(select.select() >= 0){
//返回處于就緒狀態(tài)的keys
Set keyReady = select.selectedKeys();
//輪詢每一個就緒狀態(tài)的key,通過key可以得到channel,也可以通過key從selector里刪除
for( Iterator iter = keyReady.iterator(); iter.hasNext(); ){
SelectionKey sk = iter.next();
iter.remove();
System.out.println("cancel" + select.keys().size());
SocketChannel client = null;
if ( sk.channel() instanceof ServerSocketChannel){
ss= (ServerSocketChannel)sk.channel();
client = ss.accept();
System.out.println("accept: " + client.socket());
//client.socket().close();
//必須配置成non-blocking
client.configureBlocking(false);
//把非被動socket注冊到selector
client.register(select, SelectionKey.OP_READ);
}
else if (sk.channel() instanceof SocketChannel ){
SocketChannel ch = (SocketChannel)sk.channel();
ByteBuffer recvBuf = ByteBuffer.allocate(100);
//必須用nio中的ByteBuffer,否則會出錯
int len = ch.read(recvBuf);
if ( len < 0){
//移除前必須關(guān)閉socket,否則會有很多socket處于打開狀態(tài)
ch.socket().close();
//從selector移除channel
sk.cancel();
continue;
}
recvBuf.flip();
ch.write(recvBuf);
//sk.cancel();
System.out.println("cancel" + select.keys().size() + "len " + len);
len = ch.read(recvBuf);
//關(guān)閉channel,此時會關(guān)閉channel對應(yīng)的socket,同時從selector中移除這個channel
// ?ch.close();
System.out.println("len" + len);
}
else{
System.out.println("error change");
}
}
}
System.out.println("end======");
總結(jié)
以上是生活随笔為你收集整理的nio的应用 java_Java NIO 在网络编程中的应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为企业提供本地销售人员的Universa
- 下一篇: java 文件递归删除文件夹_Java十