天天看點

Java Nio 十、Java NIO ServerSocketChannel

最後更新時間:2014-06-25

一個Java NIO的ServerSocketChannel是一個可以監聽進來的TCP連接配接的通道,就像是在标準的Java 網絡中的ServerSocket。這個ServerSocketChannel類位于java.nio.channels的包中。

這裡有一個例子:

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

serverSocketChannel.socket().bind(new InetSocketAddress(9999));

while(true){
    SocketChannel socketChannel =
            serverSocketChannel.accept();

    //do something with socketChannel...
}
           

打開一個ServerSocketChannel

你可以通過調用ServerSocketChannel.open()方法打開。這裡有一個例子:

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
           

關閉一個ServerSocketChannel

你可以通過調用ServerSocketChannel.close()方法關閉它。就像下面這樣做:

serverSocketChannel.close();
           

監聽進來的連接配接

可以調用ServerSocketChannel.accept()方法監聽進來的連接配接。當這個accept()方法傳回的時候,它将會傳回一個伴随着連接配接的SocketChannel。是以,這個accept方法會堵塞直到一個進來的連接配接到達。

由于你不感興趣的隻是監聽一個單獨的連接配接,你可以在一個while循環裡面調用accept方法。這裡有一個例子:

while(true){
    SocketChannel socketChannel =
            serverSocketChannel.accept();

    //do something with socketChannel...
}
           

當然了,比起true來說,在while循環中你可能會使用一些其他的中止條件。

非阻塞模式

一個ServerSocketChannel可以被設定成為非堵塞模式。在非堵塞模式下,這個accept()方法會立刻傳回,是以可能傳回為空在沒有進來的連接配接到達的情況下。是以你将會不得不檢查這個傳回的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...
        }
}
           

翻譯位址:http://tutorials.jenkov.com/java-nio/server-socket-channel.html