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é)。