Java NIO的ServerSocketChannel
就是用来监听TCP连接的,就像标准的Java网络编程里的ServerSocket
一样。ServerSocketChannel
类在java.nio.channels
包下。
如下示例:
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().bind(new InetAddress(9999));
while (true) {
SocketChannel socketChannel = serverSocketChannel.accept();
// 操作socketChannel
}
Opening a ServerSocketChannel
调用ServerSocketChannel.open()
放可以打开一个ServerSocketChannel
。就像这样:
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
Closing a ServerSocketChannel
调用ServerSocketChannel.close()
放可以关闭一个ServerSocketChannel
。就像这样:
serverSocketChannel.close();
Listening for Incoming Connections
调用ServerSocketChannel.accept()
方法可以监听连入的TCP连接。当accpet()
方法返回的时候,它会返回一个带着连入的连接信息的SocketChannel
。也就是说,accept()
方法会阻塞至有新的连接到达。
一般我们都不会只监听一个连接,所以你可以在一个while-循环内部调用accpet()
方法。就像这样:
while (true) {
SocketChannel socketChannel = serverSocketChannel.accept();
// 操作socketChannel
}
当然,除了用true
作为while-循环的条件,你还可以用其他的停止条件。
Non-blocking Mode
ServerSocketChannel
可以设置为非阻塞模式。在非阻塞模式下,accept()
方法会立即返回,因此此时没有新的连接,它会返回null。因此你需要检查返回的SocketChannel
是否为null。如下:
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().bind(new InetAddress(9999));
serverSocketChannel.configureBlocking(false);
while (true) {
SocketChannel socketChannel = serverSocketChannel.accept();
if (Objects.nonNull(socketChannel)) {
// 操作socketChannel
}
}
说明
发现貌似有人在看这个系列文章了,有必要说明下,这个Java NIO系列来源于jenkov.com,本文只是翻译,希望大家千万不要误会,本文不是原创。原文地址:Java NIO。
网友评论