最後更新時間: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