天天看點

Java NIO ServerSocketChannel

Java NIO ServerSocketChannel是一個監聽傳入的TCP連接配接的通道,就像标準Java Networking中的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...
}
      

1.打開一個ServerSocketChannel

可以通過調用ServerSocketChannel.open()方法來打開ServerSocketChannel:

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
      

2.關閉ServerSocketChannel

通過調用ServerSocketChannel.close()方法來關閉ServerSocketChannel:

serverSocketChannel.close();
      

3.監聽連接配接

通過調用ServerSocketChannel.accept()方法來監聽連接配接。當accept()方法傳回時,它将傳回連接配接的SocketChannel。是以,accept()方法将阻塞,直到傳入連接配接到達為止。

通常不會僅監聽一個連接配接,是以可以在while循環内調用accept():

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

    //do something with socketChannel...
}
      

4.非阻塞模式

可以将ServerSocketChannel設定為非阻塞模式,在非阻塞模式下,accept()方法立即傳回,如果沒有連接配接到達,則傳回null。是以,必須檢查傳回的SocketChannel是否為null:

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...
        }
}
      

原文位址: https://www.zhblog.net/go/java/tutorial/java-nio-server-socket-channel?t=617