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