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

您的位置:首頁技術(shù)文章
文章詳情頁

小白也可以學(xué)會的Java NIO的Write事件

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

//打開選擇器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 // 一般是響應(yīng)客戶端的數(shù)據(jù) // 直接是write寫不就完事了嘛,為啥需要write事件? // channel.write(...)}iter.remove(); }}1.2 解惑寫事件

對NIO的寫操作:

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

如果有channel在Selector上注冊了SelectionKey.OP_WRITE,在調(diào)用selector.select();時,系統(tǒng)會檢查內(nèi)核寫緩沖區(qū)是否可寫:

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

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

比如服務(wù)端需要發(fā)送一個200M的Buffer,看看是否使用OP_WRITE事件的區(qū)別。

二、不使用事件

程序運行到這會等到200M文件發(fā)送完成后才繼續(xù)往下執(zhí)行,不符合異步事件模型的思想。若緩沖區(qū)一直處不可寫狀態(tài),則該過程一直在這里死循環(huán),浪費CPU。

// 200M的BufferByteBuffer buffer = .... while(buffer.hasRemaining()) { // 該方法只會寫入小于socket’s output buffer空閑區(qū)域的任何字節(jié)數(shù) // 并返回寫入的字節(jié)數(shù),可能是0字節(jié) 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 {// 發(fā)送完了就取消寫事件,否則下次還會進入寫事件分支(因為只要還可寫,就會進入)key.interestOps(key.interestOps() & ~SelectionKey.OP_WRITE); }}

要觸發(fā)寫事件,需要先向 selector 注冊該通道的寫事件,跟注冊讀事件一樣,當(dāng)?shù)讓訉懢彌_區(qū)有空閑就會觸發(fā)寫事件了,而一般來說底層的寫緩沖區(qū)大部分都是空閑的。所以一般只要注冊了寫事件,就會立馬觸發(fā)了,為了避免 cpu 空轉(zhuǎn),在寫操作完成后需要把寫事件取消掉,然后下次再有寫操作時重新注冊寫事件。

四、NIO Client端

開發(fā)的一般步驟

// 打開選擇器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);// 循環(huán)處理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事件何時觸發(fā),特別是為什么要在key.isConnectable()分支里調(diào)用finishConnect方法后才能進行讀寫操作。

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

到此這篇關(guān)于小白也可以學(xué)會的Java NIO的Write事件的文章就介紹到這了,更多相關(guān)Java NIO的Write事件內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美成人aaa| 久久裸体视频| 五月精品视频| 成人av三级| 卡一卡二国产精品| 91成人在线精品视频| 99久久亚洲精品蜜臀| 久久国产日韩欧美精品| 国产一区清纯| 日韩国产一区二区三区| 欧美一区影院| 日本一区二区三区视频在线看| 日韩亚洲国产欧美| 欧美日韩水蜜桃| av资源中文在线| 红杏一区二区三区| 美女av一区| 国产美女撒尿一区二区| 日本电影久久久| 激情综合亚洲| 久久精品播放| 日韩欧美午夜| 日韩精品2区| 亚洲成人不卡| 国产亚洲一区二区手机在线观看| 国产精品va视频| 蜜桃视频在线观看一区二区| 午夜在线视频观看日韩17c| 亚洲一级网站| 亚洲福利免费| 亚洲欧美综合| 99热精品在线| 天堂成人国产精品一区| 丝袜国产日韩另类美女| 热久久免费视频| 蜜臀av性久久久久蜜臀aⅴ四虎| 国产亚洲在线观看| 视频一区中文字幕| 天堂va欧美ⅴa亚洲va一国产| 日本不卡一区二区三区| 日韩免费精品| 国产日韩欧美在线播放不卡| 国产精品videossex久久发布 | 中文精品电影| 中文字幕亚洲精品乱码| 日韩激情中文字幕| 国产欧美日韩综合一区在线播放| 国产精品115| 欧美www视频在线观看| 精品捆绑调教一区二区三区| 精品一区在线| 丝袜国产日韩另类美女| 黄色网一区二区| 欧美91在线| 另类专区亚洲| 一本色道久久精品| 日本不卡一二三区黄网| 麻豆精品久久久| 久久免费高清| 蜜臀久久99精品久久久久久9| 欧美在线首页| 国精品产品一区| 激情久久中文字幕| 综合欧美精品| 美女在线视频一区| 亚洲福利一区| 日韩在线成人| 亚洲三级精品| 精品久久美女| 久久精品高清| 日韩欧美久久| 日韩精品dvd| 亚洲开心激情| 精品国产乱码久久久久久樱花| 午夜影院一区| 在线精品一区二区| 精品视频高潮| 欧美特黄一区| 国产精品xvideos88| 日韩av一级| 亚洲精品女人| 91综合网人人| 久久高清一区| 风间由美中文字幕在线看视频国产欧美| 亚洲婷婷免费| 亚洲精选91| 国产精品多人| 97人人精品| 亚洲精品中文字幕99999| 美腿丝袜亚洲一区| 国产美女精品| 国产精品蜜芽在线观看| 久久国产精品99国产| 欧美成a人片免费观看久久五月天| 麻豆精品蜜桃| 91福利精品在线观看| 亚洲二区精品| 国产亚洲精品美女久久久久久久久久| 成人久久一区| 久久国际精品| 亚洲伊人av| 美女国产精品| 麻豆极品一区二区三区| 免费精品视频| 在线观看精品| 国产情侣一区| 羞羞答答国产精品www一本| 福利在线一区| 欧美亚洲网站| 老牛影视一区二区三区| 国内精品亚洲| 四虎精品永久免费| 日韩在线看片| 久久亚洲精品中文字幕| 一区二区三区四区日韩| 99视频精品全国免费| 国产福利一区二区精品秒拍| 亚洲午夜久久| 欧美~级网站不卡| 大香伊人久久精品一区二区| 中文字幕亚洲精品乱码| 婷婷综合六月| 久久精品国产久精国产爱| 亚洲人www| 婷婷综合激情| 性欧美videohd高精| 老牛国内精品亚洲成av人片| 天堂av在线一区| 亚洲精品88| 免费在线欧美黄色| 欧美日韩夜夜| 日本电影久久久| 蜜桃视频一区二区三区| 免费视频亚洲| 久久夜夜操妹子| 成人在线免费观看网站| 国产欧美精品| 97精品久久| 亚洲18在线| 一区二区精品| 免费精品视频在线| 国产精品日韩| 国产91一区| 久久久久蜜桃| 亚洲精品一级二级| 亚洲人妖在线| 亚洲日产av中文字幕| 在线一区二区三区视频| 亚洲一区二区免费看| 蜜臀av在线播放一区二区三区| 亚洲韩日在线| av在线资源| 美女网站一区| 国产偷自视频区视频一区二区| 亚洲精一区二区三区| 亚洲精品欧美| 国产精品xxxav免费视频| 日韩av字幕| 国产精品久久久久久妇女 | 久久一区二区三区电影| 欧美日韩在线播放视频| 欧洲激情综合| 日韩一区精品视频| 亚洲精品大片| 国产日韩一区二区三免费高清| 国产欧美久久一区二区三区| 国产激情久久| 成人国产精品| 欧美一区二区三区高清视频 | 久久丁香四色| 麻豆视频一区| 97视频热人人精品免费| 久久精品免费一区二区三区| 欧美精选一区二区三区| 蜜乳av另类精品一区二区| 91久久国产| 国产精品美女| 日韩欧美另类中文字幕| 久久狠狠亚洲综合| 日韩综合精品| 国产精品日韩欧美一区| 国产精品主播在线观看| 久久人人99| 久久国产精品免费一区二区三区| 精品一区二区男人吃奶| 久久国产成人| 国产成人精选| 免费成人性网站| 黄色欧美在线| 美国三级日本三级久久99| 久久一区精品| 久久国产精品久久久久久电车| 精品午夜av| 久久亚洲一区| 成人日韩在线| 国产精品久久久久久久久久妞妞 | 男人的天堂久久精品| 久久精品国产在热久久| 免费日韩视频| 欧美国产小视频|