摘要:非阻塞模式下方法在尚未讀取到任何數(shù)據(jù)時(shí)可能就返回了。非阻塞模式與選擇器非阻塞模式與選擇器搭配會(huì)工作的更好,通過(guò)將一或多個(gè)注冊(cè)到,可以詢問(wèn)選擇器哪個(gè)通道已經(jīng)準(zhǔn)備好了讀取,寫入等。
Java NIO中的SocketChannel是一個(gè)連接到TCP網(wǎng)絡(luò)套接字的通道。可以通過(guò)以下2種方式創(chuàng)建SocketChannel:
1.打開(kāi)一個(gè)SocketChannel并連接到互聯(lián)網(wǎng)上的某臺(tái)服務(wù)器。 2.一個(gè)新連接到達(dá)ServerSocketChannel時(shí),會(huì)創(chuàng)建一個(gè)SocketChannel。
打開(kāi) SocketChannel
下面是SocketChannel的打開(kāi)方式:
SocketChannel socketChannel = SocketChannel.open(); socketChannel.connect(new InetSocketAddress("http://jenkov.com", 80)); ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); ServerSocket ss = serverSocketChannel.socket(); ss.bind(new InetSocketAddress("localhost", 9026));// 綁定地址
關(guān)閉 SocketChannel
當(dāng)用完SocketChannel之后調(diào)用SocketChannel.close()關(guān)閉SocketChannel:
socketChannel.close();
從 SocketChannel 讀取數(shù)據(jù)
要從SocketChannel中讀取數(shù)據(jù),調(diào)用一個(gè)read()的方法之一。以下是例子:
ByteBuffer buf = ByteBuffer.allocate(48); int bytesRead = socketChannel.read(buf);
首先,分配一個(gè)Buffer。從SocketChannel讀取到的數(shù)據(jù)將會(huì)放到這個(gè)Buffer中。
然后,調(diào)用SocketChannel.read()。該方法將數(shù)據(jù)從SocketChannel 讀到Buffer中。
read()方法返回的int值表示讀了多少字節(jié)進(jìn)Buffer里。
如果返回的是-1,表示已經(jīng)讀到了流的末尾(連接關(guān)閉了)。
寫入 SocketChannel
寫數(shù)據(jù)到SocketChannel用的是SocketChannel.write()方法,該方法以一個(gè)Buffer作為參數(shù)。示例如下:
String newData = "New String to write to file..." + System.currentTimeMillis(); ByteBuffer buf = ByteBuffer.allocate(48); buf.clear(); buf.put(newData.getBytes()); buf.flip(); while(buf.hasRemaining()) { channel.write(buf); }
注意SocketChannel.write()方法的調(diào)用是在一個(gè)while循環(huán)中的。Write()方法無(wú)法保證能寫多少字節(jié)到SocketChannel。所以,我們重復(fù)調(diào)用write()直到Buffer沒(méi)有要寫的字節(jié)為止。
非阻塞模式
可以設(shè)置 SocketChannel 為非阻塞模式(non-blocking mode).設(shè)置之后,就可以在異步模式下調(diào)用connect(), read() 和write()了。
connect()
如果SocketChannel在非阻塞模式下,此時(shí)調(diào)用connect(),該方法可能在連接建立之前就返回了。為了確定連接是否建立,可以調(diào)用finishConnect()的方法。像這樣:
socketChannel.configureBlocking(false);//非阻塞 socketChannel.connect(new InetSocketAddress("http://jenkov.com", 80)); while(! socketChannel.finishConnect() ){ //wait, or do something else... }
write()
非阻塞模式下,write()方法在尚未寫出任何內(nèi)容時(shí)可能就返回了。所以需要在循環(huán)中調(diào)用write()。
read()
非阻塞模式下,read()方法在尚未讀取到任何數(shù)據(jù)時(shí)可能就返回了。所以需要關(guān)注它的int返回值,它會(huì)告訴你讀取了多少字節(jié)。
非阻塞模式與選擇器
非阻塞模式與選擇器搭配會(huì)工作的更好,通過(guò)將一或多個(gè)SocketChannel注冊(cè)到Selector,可以詢問(wèn)選擇器哪個(gè)通道已經(jīng)準(zhǔn)備好了讀取,寫入等。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/71756.html
摘要:編程核心是通道和選擇器,選擇器通過(guò)不斷輪詢,執(zhí)行對(duì)應(yīng)的函數(shù)。所以我們需要捕獲這個(gè)異常,并且開(kāi)始不斷重連。如果客戶端關(guān)閉那么服務(wù)器也要主動(dòng)關(guān)閉他數(shù)據(jù)庫(kù)代碼及實(shí)體類如果還想實(shí)現(xiàn)數(shù)據(jù)庫(kù)方面代碼,私我 ...
摘要:為解決這問(wèn)題,我們發(fā)現(xiàn)元兇處在一線程一請(qǐng)求上,如果一個(gè)線程能同時(shí)處理多個(gè)請(qǐng)求,那么在高并發(fā)下性能上會(huì)大大改善。這樣一個(gè)線程可以同時(shí)發(fā)起多個(gè)調(diào)用,并且不需要同步等待數(shù)據(jù)就緒。表示當(dāng)前就緒的事件類型。 JAVA NIO 一步步構(gòu)建I/O多路復(fù)用的請(qǐng)求模型 摘要:本文屬于原創(chuàng),歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)保留出處:https://github.com/jasonGeng88/blog 文章一:JAVA ...
摘要:通道可以異步讀寫。使用的方法讀取數(shù)據(jù)創(chuàng)建一個(gè)讀數(shù)據(jù)緩沖區(qū)對(duì)象從通道中讀取數(shù)據(jù)使用的方法寫入數(shù)據(jù)創(chuàng)建一個(gè)寫數(shù)據(jù)緩沖區(qū)對(duì)象寫入數(shù)據(jù)關(guān)閉完成使用后,您必須關(guān)閉它。五提供了一種被稱為的新功能,也稱為本地矢量。功能是通道提供的并不是。 歷史回顧: Java NIO 概覽 Java NIO 之 Buffer(緩沖區(qū)) 其他高贊文章: 面試中關(guān)于Redis的問(wèn)題看這篇就夠了 一文輕松搞懂redis集...
摘要:是什么就不在此文展開(kāi),這篇主要來(lái)介紹下我們要怎樣通過(guò)來(lái)構(gòu)建一個(gè)服務(wù)客戶端程序的。的通信完全依賴與,數(shù)據(jù)的寫入和讀取都是通過(guò)從中寫入讀取。和上的調(diào)用一樣的功能,監(jiān)聽(tīng)已經(jīng)注冊(cè)在上面的文件描述符,監(jiān)聽(tīng)上的事件。 NIO是什么就不在此文展開(kāi),這篇主要來(lái)介紹下我們要怎樣通過(guò)java NIO來(lái)構(gòu)建一個(gè)服務(wù)客戶端程序的。 0x01 涉及知識(shí)點(diǎn) NIO建立一個(gè)服務(wù)端和客戶端程序主要涉及的知識(shí)點(diǎn)有: ...
摘要:通常來(lái)說(shuō)所有的的操作都是從開(kāi)始的一個(gè)類似于一個(gè)和對(duì)比我們可以在同一個(gè)中執(zhí)行讀和寫操作然而同一個(gè)僅僅支持讀或?qū)懣梢援惒降刈x寫而是阻塞的同步讀寫總是從中讀取數(shù)據(jù)或?qū)?shù)據(jù)寫入到中類型有文件操作操作操作操作使用在服務(wù)器端這些通道涵蓋了和網(wǎng)絡(luò)以及文件 Java NIO Channel 通常來(lái)說(shuō), 所有的 NIO 的 I/O 操作都是從 Channel 開(kāi)始的. 一個(gè) channel 類似于一個(gè) ...
摘要:抽象類有一個(gè)方法用于使通道處于阻塞模式或非阻塞模式。注意抽象類的方法是由抽象類實(shí)現(xiàn)的,都是直接繼承了抽象類。大家有興趣可以看看的源碼,各種抽象類和抽象類上層的抽象類。 歷史回顧: Java NIO 概覽 Java NIO 之 Buffer(緩沖區(qū)) Java NIO 之 Channel(通道) 其他高贊文章: 面試中關(guān)于Redis的問(wèn)題看這篇就夠了 一文輕松搞懂redis集群原理及搭建...
閱讀 3081·2021-11-24 10:47
閱讀 3831·2021-11-02 14:43
閱讀 2228·2021-09-26 10:15
閱讀 2254·2021-09-08 09:35
閱讀 560·2019-08-30 12:45
閱讀 2781·2019-08-29 17:04
閱讀 3214·2019-08-26 14:05
閱讀 1259·2019-08-26 12:10