鍍金池/ 教程/ Java/ 10. Java NIO ServerSocketChannel服務(wù)端套接字通道
16. Java NIO Files
03. Java NIO Channel通道
06. Java NIO Channel to Channel Transfers通道傳輸接口
11. Java NIO: Non-blocking Server非阻塞服務(wù)器
01. Java NIO 教程
17. Java NIO AsynchronousFileChannel異步文件通道
09. Java NIO SocketChannel套接字通道
07. Java NIO Selector選擇器
08. Java NIO FileChannel文件通道
02. Java NIO 概覽
04. Java NIO Buffer緩沖區(qū)
10. Java NIO ServerSocketChannel服務(wù)端套接字通道
05. Java NIO Scatter / Gather
14. Java NIO vs. IO
13.Java NIO Pipe管道
12. Java NIO DatagramChannel數(shù)據(jù)報通道
15.Java NIO Path路徑

10. Java NIO ServerSocketChannel服務(wù)端套接字通道

原文鏈接: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

打開一個ServerSocketChannel我們需要調(diào)用他的open()方法,例如:

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

關(guān)閉ServerSocketChannel

關(guān)閉一個ServerSocketChannel我們需要調(diào)用他的close()方法,例如:

serverSocketChannel.close();

監(jiān)聽鏈接

通過調(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...
    }
}