国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java NIO SocketChannel

MRZYD / 2677人閱讀

摘要:非阻塞模式下方法在尚未讀取到任何數(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ān)文章

  • JavaNio編程實(shí)現(xiàn)網(wǎng)絡(luò)編程的多客戶端與服務(wù)器連接完整步驟

    摘要:編程核心是通道和選擇器,選擇器通過(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ǎng)友 評(píng)論0 收藏0
  • JAVA NIO 一步步構(gòu)建I/O多路復(fù)用的請(qǐng)求模型

    摘要:為解決這問(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 ...

    X_AirDu 評(píng)論0 收藏0
  • Java NIO 之 Channel(通道)

    摘要:通道可以異步讀寫。使用的方法讀取數(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集...

    piglei 評(píng)論0 收藏0
  • java NIO

    摘要:是什么就不在此文展開(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)有: ...

    AlphaWatch 評(píng)論0 收藏0
  • Java NIO 的前生今世 之二 NIO Channel 小結(jié)

    摘要:通常來(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è) ...

    JasonZhang 評(píng)論0 收藏0
  • Java NIO之Selector(選擇器)

    摘要:抽象類有一個(gè)方法用于使通道處于阻塞模式或非阻塞模式。注意抽象類的方法是由抽象類實(shí)現(xiàn)的,都是直接繼承了抽象類。大家有興趣可以看看的源碼,各種抽象類和抽象類上層的抽象類。 歷史回顧: Java NIO 概覽 Java NIO 之 Buffer(緩沖區(qū)) Java NIO 之 Channel(通道) 其他高贊文章: 面試中關(guān)于Redis的問(wèn)題看這篇就夠了 一文輕松搞懂redis集群原理及搭建...

    xiaokai 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<