日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

小白也可以學會的Java NIO的Write事件

瀏覽:190日期:2022-08-11 13:55:05
目錄一、NIO Server端1.1 多路復用開發一般步驟1.2 解惑寫事件二、不使用事件三、使用事件四、NIO Client端一、NIO Server端1.1 多路復用開發一般步驟

//打開選擇器Selector selector = Selector.open();//打開通到ServerSocketChannel socketChannel = ServerSocketChannel.open();//配置非阻塞模型socketChannel.configureBlocking(false);//綁定端口socketChannel.bind(new InetSocketAddress(8080));//注冊事件,OP_ACCEPT只適用于ServerSocketChannel socketChannel.register(selector, SelectionKey.OP_ACCEPT);while (true) { selector.select(); Set<SelectionKey> selectionKeys = selector.selectedKeys(); Iterator<SelectionKey> iter = selectionKeys.iterator(); while(iter.hasNext()) {SelectionKey key = iter.next();if(key.isAcceptable()) { SocketChannel channel = ((ServerSocketChannel)key.channel()).accept(); channel.configureBlocking(false); channel.register(selector,SelectionKey.OP_READ);}if(key.isWritable()) {}if(key.isReadable()) { SocketChannel channel = (SocketChannel) key.channel(); ByteBuffer readBuffer = ByteBuffer.allocate(1024); channel.read(readBuffer); readBuffer.flip(); // handler Buffer // 一般是響應客戶端的數據 // 直接是write寫不就完事了嘛,為啥需要write事件? // channel.write(...)}iter.remove(); }}1.2 解惑寫事件

對NIO的寫操作:

為什么要注冊寫事件 何時注冊寫事件 為什么寫完之后要取消注冊寫事件

如果有channel在Selector上注冊了SelectionKey.OP_WRITE,在調用selector.select();時,系統會檢查內核寫緩沖區是否可寫:

如果可寫,selector.select();立即返回,進入key.isWritable() 何時不可寫?比如緩沖區已滿,channel調用了shutdownOutPut等

當然除了注冊寫事件,你也可以在channel直接調用write(…),也可以將數據發出去,但這樣不夠靈活,而且可能浪費CPU。

比如服務端需要發送一個200M的Buffer,看看是否使用OP_WRITE事件的區別。

二、不使用事件

程序運行到這會等到200M文件發送完成后才繼續往下執行,不符合異步事件模型的思想。若緩沖區一直處不可寫狀態,則該過程一直在這里死循環,浪費CPU。

// 200M的BufferByteBuffer buffer = .... while(buffer.hasRemaining()) { // 該方法只會寫入小于socket’s output buffer空閑區域的任何字節數 // 并返回寫入的字節數,可能是0字節 channel.write(buffer);}三、使用事件

if(key.isReadable()) {// 200M Buffer ByteBuffer buffer = .... // 注冊寫事件 key.interestOps(key.interestOps() | SelectionKey.OP_WRITE); // 綁定Buffer key.attach(buffer);}// 可寫分支if(key.isWritable()) { ByteBuffer buffer = (ByteBuffer) key.attachment(); SocketChannel channel = (SocketChannel) key.channel(); if (buffer.hasRemaining()) {channel.write(buffer) } else {// 發送完了就取消寫事件,否則下次還會進入寫事件分支(因為只要還可寫,就會進入)key.interestOps(key.interestOps() & ~SelectionKey.OP_WRITE); }}

要觸發寫事件,需要先向 selector 注冊該通道的寫事件,跟注冊讀事件一樣,當底層寫緩沖區有空閑就會觸發寫事件了,而一般來說底層的寫緩沖區大部分都是空閑的。所以一般只要注冊了寫事件,就會立馬觸發了,為了避免 cpu 空轉,在寫操作完成后需要把寫事件取消掉,然后下次再有寫操作時重新注冊寫事件。

四、NIO Client端

開發的一般步驟

// 打開選擇器Selector selector = Selector.open();// 打開通道SocketChannel socketChannel = SocketChannel.open();// 配置非阻塞模型socketChannel.configureBlocking(false);// 連接ServersocketChannel.connect(new InetSocketAddress('127.0.0.1',8080));// 注冊事件socketChannel.register(selector, SelectionKey.OP_CONNECT | SelectionKey.OP_READ);// 循環處理while (true) { selector.select(); Set<SelectionKey> keys = selector.selectedKeys(); Iterator<SelectionKey> iter = keys.iterator(); while(iter.hasNext()) {SelectionKey key = iter.next();if(key.isConnectable()) { // 連接建立或者連接建立不成功 SocketChannel channel = (SocketChannel) key.channel(); // 完成連接建立 if(channel.finishConnect()) { }}if(key.isReadable()) { SocketChannel channel = (SocketChannel) key.channel(); ByteBuffer buffer = ByteBuffer.allocate(500 * 1024 * 1024); buffer.clear(); channel.read(buffer); // buffer Handler}iter.remove(); }}

起初對OP_CONNECT事件還有finishConnect不理解,OP_CONNECT事件何時觸發,特別是為什么要在key.isConnectable()分支里調用finishConnect方法后才能進行讀寫操作。

首先,在non-blocking模式下調用socketChannel.connect(new InetSocketAddress(“127.0.0.1”,8080));連接遠程主機,如果連接能立即建立就像本地連接一樣,該方法會立即返回true,否則該方法會立即返回false,然后系統底層進行三次握手建立連接。連接有兩種結果,一種是成功連接,第二種是異常,但是connect方法已經返回,無法通過該方法的返回值或者是異常來通知用戶程序建立連接的情況,所以由OP_CONNECT事件和finishConnect方法來通知用戶程序。不管系統底層三次連接是否成功,selector都會被喚醒繼而觸發OP_CONNECT事件,如果握手成功,并且該連接未被其他線程關閉,finishConnect會返回true,然后就可以順利的進行channle讀寫。如果網絡故障,或者遠程主機故障,握手不成功,用戶程序可以通過finishConnect方法獲得底層的異常通知,進而處理異常。

到此這篇關于小白也可以學會的Java NIO的Write事件的文章就介紹到這了,更多相關Java NIO的Write事件內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲欧美伊人| 精品国产午夜| 激情丁香综合| 在线日韩欧美| 美女少妇全过程你懂的久久| 久久高清免费| 欧美精选一区二区三区| 亚洲天堂一区二区| 激情欧美丁香| 在线亚洲免费| 男女性色大片免费观看一区二区 | 色老板在线视频一区二区| 日韩在线短视频| 好看的亚洲午夜视频在线| 久热精品在线| 国产一卡不卡| 国产白浆在线免费观看| 欧洲激情综合| 日韩高清一级| 成人在线免费观看网站| a国产在线视频| 欧美一区二区三区高清视频| 亚洲综合丁香| 国产剧情在线观看一区| 国产成年精品| 亚洲精品1区| 日本免费一区二区视频| 国产一区调教| 尤物在线精品| 国产精品片aa在线观看| 日韩欧美精品| 蜜臀av性久久久久蜜臀aⅴ流畅| 国产日韩一区二区三区在线播放| 福利在线一区| 蜜桃av一区二区三区电影| 久久国产精品色av免费看| 欧美激情另类| 中文无码日韩欧| 成人午夜在线| 国产美女精品| 麻豆成人91精品二区三区| 国产欧美一区二区三区精品酒店| 亚洲一区日韩在线| 国产精品资源| 亚洲午夜一级| 欧美一级二区| 99精品在线| 日韩高清三区| 成人羞羞在线观看网站| 亚洲精品乱码日韩| 狠狠久久伊人| 香蕉久久国产| 色综合狠狠操| 亚洲另类黄色| 日韩久久一区二区三区| 日韩在线网址| 久久高清免费| 国产精久久一区二区| 国产国产精品| 麻豆一区在线| 蜜臀av一区二区在线免费观看| 97精品中文字幕| 日韩福利在线观看| 蜜桃成人av| 国内自拍视频一区二区三区| 黄色亚洲大片免费在线观看| 捆绑调教美女网站视频一区| 美国欧美日韩国产在线播放| 日韩伦理一区| 国产精品黄网站| 一区二区三区网站| 久久久久美女| 韩日一区二区| 欧美日韩黄网站| 三级在线观看一区二区| 视频二区不卡| 精品国产亚洲一区二区在线观看| 亚洲免费毛片| 在线午夜精品| 日韩精品永久网址| 国产日韩三级| 免费久久精品视频| 欧美精品激情| 综合日韩av| 久久av免费| 日韩国产欧美在线视频| 婷婷综合网站| 91精品精品| 中文字幕在线视频网站| 麻豆一区二区三| 日韩午夜视频在线| 国产一区白浆| 亚洲电影在线一区二区三区| 日本少妇一区| 麻豆理论在线观看| 国产乱子精品一区二区在线观看| 夜久久久久久| 亚洲五月婷婷| 欧美三区四区| 不卡福利视频| 国产一区二区三区四区| 欧美a在线观看| 国产精品亚洲人成在99www| 日本一区免费网站| 亚洲综合精品| 免费观看不卡av| 伊人网在线播放| 福利一区视频| 成人高清一区| 久久久久久自在自线| 国产精品黄色| 欧美永久精品| 国产欧美视频在线| 国产精品亚洲欧美| 国产精品www994| 欧美黑人做爰爽爽爽| 国产精品任我爽爆在线播放| 国产精品一区二区三区四区在线观看 | 亚洲精品极品| 国产亚洲午夜| 亚洲深爱激情| 视频一区二区不卡| 视频一区视频二区在线观看| 视频一区中文字幕国产| 亚洲一级大片| 日本午夜精品一区二区三区电影 | 亚洲一区国产| 美女久久一区| 一二三区精品| 久久精品xxxxx| 麻豆传媒一区二区三区| 国产91在线播放精品| 日韩理论视频| 香蕉久久精品| 亚洲成人精选| 快she精品国产999| 日本成人一区二区| 国产欧美日韩亚洲一区二区三区| 国产精品hd| 国产中文欧美日韩在线| 中文字幕在线视频久| 久久久久国产精品一区三寸| 蜜桃tv一区二区三区| 视频一区国产视频| 国产亚洲久久| 欧美丰满日韩| 亚洲香蕉网站| 中文字幕av亚洲精品一部二部| 欧美日韩亚洲一区三区| 久久福利在线| 日韩在线免费| 日韩制服丝袜av| 欧美国产专区| 在线日韩电影| 亚洲精品日本| 精品久久久中文字幕| 亚洲国产专区校园欧美| 亚洲最新av| 精品一区电影| 一区二区自拍| 久久精品999| 精品丝袜在线| 日欧美一区二区| 日韩综合一区| 99综合视频| 国产精品magnet| 欧美1级日本1级| 91大神在线观看线路一区| 黄在线观看免费网站ktv| 亚洲一区二区免费看| 国产精品v一区二区三区| 久久精品免费一区二区三区 | 蜜臀久久99精品久久久久宅男 | 水蜜桃精品av一区二区| 黄色免费成人| 美女视频免费精品| 欧洲激情综合| 国产精品亚洲一区二区在线观看 | 欧美日韩免费观看视频| 亚洲毛片网站| 免费观看亚洲| 日韩激情一区二区| 久久免费黄色| 国产精品主播| 国产婷婷精品| 成人精品国产亚洲| 亚洲美女91| 成人高清一区| 亚洲91在线| 91精品国产91久久久久久黑人| 日韩av电影一区| 蜜桃tv一区二区三区| 国产精品1区| 免费观看久久久4p| 日韩成人亚洲| 国产日产一区| 亚洲一区二区毛片| а√天堂8资源在线| 日韩精品a在线观看91| 国产字幕视频一区二区|