鍍金池/ 教程/ Java/ Java NIO ServerSocketChannel
Java NIO選擇器
Java NIO ServerSocketChannel
Java NIO通道FileLock
Java NIO組件
Java NIO編碼和解碼
Java NIO包
Java NIO緩沖區(qū)
Java NIO教程
Java NIO SocketChannel
Java NIO時間服務(wù)器示例
Java NIO字符集
Java NIO通道之間的數(shù)據(jù)傳輸
Java NIO通道
Java IO與NIO比較
Java NIO管道
Java NIO分散/聚集或向量I/O

Java NIO ServerSocketChannel

Java NIO ServerSocketChannel還可以用來將通道與TCP(傳輸控制協(xié)議)網(wǎng)絡(luò)套接字連接起來。它相當于網(wǎng)絡(luò)編程中使用的Java網(wǎng)絡(luò)套接字。ServerSocketChannel類位于java.nio.channels包中。

下面我們來看看ServerSocketChannel的例子:

ServerSocketChannel ssc = ServerSocketChannel.open();  
ssc.socket().bind(new InetSocketAddress(8085));  
while(true){  
    SocketChannel socketChannel = ssc.accept();  
}

關(guān)閉ServerSocketChannel

通過調(diào)用ServerSocketChannel.close()方法執(zhí)行所有操作后,可以關(guān)閉ServerSocketChannel。

下面是關(guān)閉ServerSocketChannel的語法是:

ServerSocketChannel.close();

打開ServerSocketChannel

要打開ServerSocketChannel,可通過調(diào)用ServerSocketChannel.open()方法打開一個ServerSocketChannel。

用于打開ServerSocketChannel的語法是:

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

監(jiān)聽連接

監(jiān)聽客戶商連接,可通過調(diào)用ServerSocketChannel.accept()方法完成。accept()方法用于返回帶有傳入連接的SocketChannel。

下面是監(jiān)聽連接的例子:

while(true){  
    SocketChannel sc = serverSocketChannel.accept();  
}

while循環(huán)中調(diào)用accept()方法,因為這里要監(jiān)聽所有傳入的連接。

從ServerSocketChannel讀取數(shù)據(jù)

要從ServerSocketChannel讀取數(shù)據(jù),可調(diào)用read()方法之一。

下面是從ServerSocketChannel讀取數(shù)據(jù)的例子:

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

首先分配緩沖區(qū)。從ServerSocketChannel讀取的數(shù)據(jù)存儲在緩沖區(qū)中。

其次,調(diào)用ServerSocketChannel.read()方法,并將數(shù)據(jù)從ServerSocketChannel讀入緩沖區(qū)。read()方法的整數(shù)值返回寫入緩沖區(qū)的字節(jié)數(shù)。

將數(shù)據(jù)寫入ServerSocketChannel

要將數(shù)據(jù)寫入ServerSocketChannel,可使用ServerSocketChannel.write()方法,它將緩沖區(qū)(buffer)作為參數(shù)。

下面是將數(shù)據(jù)寫入ServerSocketChannel的例子:

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()) {  
    ServerSocketChannel.write(bb);  
}

ServerSocketChannel.write()方法在while循環(huán)中使用,因為write()方法寫入ServerSocketChannel的字節(jié)數(shù)目是未知的,因此需要重復使用write()方法,直到Buffer不再有可用的字節(jié)。