Java NIO SocketChannel


Java NIO SocketChannel用於將通道與TCP(傳輸控制協定)網路通訊端連線。它相當於網路程式設計中使用的Java網路通訊端(Socket)。

Java NIO中有兩種可用於建立SocketChannel的方法:

  • 當傳入連線到達ServerSocketChannel時,可以建立它。
  • 開啟一個SocketChannel,並在網路上與伺服器連線。

我們來看看使用選擇器的SocketChannel用戶端 - 伺服器通訊的框圖:

開啟通訊端通道 - SocketChannel

可以通過呼叫SocketChannel.Open()方法開啟一個SocketChannel

開啟通訊端通道(SocketChannel)的語法是:

SocketChannel sc = SocketChannel.open();  
sc.connect(new InetSocketAddress("localhost", 9099));

關閉通訊端通道 - SocketChannel

通過呼叫SocketChannel.close()方法執行所有操作後,可以關閉SocketChannel

關閉通訊端通道(SocketChannel)的語法是:

SocketChannel.close();

從SocketChannel讀取

要從SocketChannel讀取資料,呼叫read()方法之一。

下面來看如何從SocketChannel讀取資料的例子:

ByteBuffer bb = ByteBuffer.allocate(84);  
int bytesRead = SocketChannel.read(bb);

首先分配緩衝區。 從SocketChannel讀取的資料儲存在緩衝區中。

其次,呼叫SocketChannel.read()方法,並將資料從SocketChannel讀入緩衝區。 read()方法返回寫入緩衝區位元組數的整數值。

寫入通訊端通道-SocketChannel

要將資料寫入SocketChannel,可使用SocketChannel.write()方法並將緩衝(buffer)作為引數。

下面來看看一下將資料寫入SocketChannel的例子:

String newData = "The new String is writing in a file ..." + System.currentTimeMillis();  
ByteBuffer bb= ByteBuffer.allocate(48);  
bb.clear();  
bb.put(newData.getBytes());  
bb.flip();  
while(bb.hasRemaining()) {  
    SocketChannel.write(bb);  
}

SocketChannel.write()方法在while迴圈中使用,因為write()方法寫入SocketChannel的位元組數目是未知的,因此需要重複使用write()方法,直到Buffer沒有可用的位元組寫入。