原文鏈接:http://tutorials.jenkov.com/java-nio/server-socket-channel.html
在Java NIO中,ServerSocketChannel是用于監(jiān)聽TCP鏈接請求的通道,正如Java網(wǎng)絡(luò)編程中的ServerSocket一樣。
ServerSocketChannel實現(xiàn)類位于java.nio.channels包下面。 下面是一個示例程序:
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().bin(new InetSocketAddress(9999));
while(true) {
SocketChannel socketChannel = serverSocketChannel.accept();
//do something with socketChannel...
}
打開一個ServerSocketChannel我們需要調(diào)用他的open()方法,例如:
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
關(guān)閉一個ServerSocketChannel我們需要調(diào)用他的close()方法,例如:
serverSocketChannel.close();
通過調(diào)用accept()方法,我們就開始監(jiān)聽端口上的請求連接。當(dāng)accept()返回時,他會返回一個SocketChannel連接實例,實際上accept()是阻塞操作,他會阻塞帶去線程知道返回一個連接; 很多時候我們是不滿足于監(jiān)聽一個連接的,因此我們會把accept()的調(diào)用放到循環(huán)中,就像這樣:
while(true){
SocketChannel socketChannel = serverSocketChannel.accept();
//do something with socketChannel...
}
當(dāng)然我們可以在循環(huán)體內(nèi)加上合適的中斷邏輯,而不是單純的在while循環(huán)中寫true,以此來結(jié)束循環(huán)監(jiān)聽;
實際上ServerSocketChannel是可以設(shè)置為非阻塞模式的。在非阻塞模式下,調(diào)用accept()函數(shù)會立刻返回,如果當(dāng)前沒有請求的鏈接,那么返回值為空null。因此我們需要手動檢查返回的SocketChannel是否為空,例如:
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().bind(new InetSocketAddress(9999));
serverSocketChannel.configureBlocking(false);
while(true){
SocketChannel socketChannel = serverSocketChannel.accept();
if(socketChannel != null){
//do something with socketChannel...
}
}