日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

nio的应用 java_Java NIO 在网络编程中的应用

發布時間:2023/12/19 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 在网络编程中的应用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。