Java NIO ServerSocketChannel

Java NIO 服务端套接字管道,原文地址:http://tutorials.jenkov.com/java-nio/server-socket-channel.html

Java NIO 中的服务端套接字管道可以用于监听接入的 TCP 网络连接,就像Java 标准网络编程里的服务端套接字一样。服务端套接字管道类在包 java.nio.channels 中。
下面是一个使用小例子:

1
2
3
4
5
6
7
8
9
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().bind(new InetSocketAddress(9999));
while(true){
SocketChannel socketChannel = serverSocketChannel.accept();
// do something with socketChannel...
}

打开一个服务端套接字管道

你可以通过调用 ServerSocketChannel.open() 方法来开启一个服务端套接字管道。就像下面这样:

1
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

关闭一个服务端套接字管道

你可以通过调用 ServerSocketChannel.close() 方法来关闭一个服务端套接字管道。就像下面这样:

1
serverSocketChannel.close();

监听接入的连接

服务端套接字管道通过调用 ServerSocketChannel.accept() 方法来监听接入的网络连接。当 accept() 方法返回时,它将返回一个请求连接的套接字管道。因此,accept() 方法会阻塞直到有一个连接接入。
因为你一般不会只监听一个连接请求,所以你会在一个 while 循环中调用 accept() 方法。正如下面这样:

1
2
3
4
5
while(true){
SocketChannel socketChannel = serverSocketChannel.accept();
// do something with socketChannel...
}

当然你更可能会在 while 循环上设置循环停止条件而不是设置 true

非阻塞模式

服务端套接字管道可以被设置为非阻塞模式。在非阻塞模式下,accept() 方法会立即返回,并且大多数情况下还有没请求的连接,所以其返回值为 null。因此你必须手动检测套接字管道是否为 null。下面是使用小例子:

1
2
3
4
5
6
7
8
9
10
11
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
}
}