nio的应用 java_Java NIO 在网络编程中的应用
事實上Java nio引入了異步機制,異步I/O 在Linux上有 select poll epoll,支持多路復用。在Java里就是通過nio的一整套類來實現的,主要有:
ByteBuffer
SocketChannel
ServerSocketChannel
Selector
SelectionKey
注冊:
channel調用 register來向selector注冊,
移除:
SelectionKey.cancel //僅僅把selectionkey 對應的channel從selector中移除,socket仍然處于活動狀態,需要手動關閉。
channel.close()//從selector移除,加關閉channel關聯的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關聯
//當有連接進來時,select可以返回selectedKeys
ss.register(select, SelectionKey.OP_ACCEPT);
while(select.select() >= 0){
//返回處于就緒狀態的keys
Set keyReady = select.selectedKeys();
//輪詢每一個就緒狀態的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){
//移除前必須關閉socket,否則會有很多socket處于打開狀態
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);
//關閉channel,此時會關閉channel對應的socket,同時從selector中移除這個channel
// ?ch.close();
System.out.println("len" + len);
}
else{
System.out.println("error change");
}
}
}
System.out.println("end======");
總結
以上是生活随笔為你收集整理的nio的应用 java_Java NIO 在网络编程中的应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为企业提供本地销售人员的Universa
- 下一篇: java 文件递归删除文件夹_Java十