Java中的NIO详解Day09-ServerSocketChannel
ServerSocketChannel
- 基本概念
- ServerSocketChannel的开启
- ServerSocketChannel的关闭
- ServerSocketChannel的监听
- 非阻塞模式
基本概念
- Java NIO中的ServerSocketChannel是一个可以监听新进来的TCP连接通道,类似标准IO中的ServerSocket
ServerSocketChannel类在java.nio.channels包中
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().bind(new InetSocketAddress(8000));
while (true) {SocketChannel socketChannel = serverSocketChannel.accept();
// 关于SocketChannel的操作
...
}
ServerSocketChannel的开启
通过调用ServerSocketChannel.open() 方法来打开ServerSocketChannel:
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
ServerSocketChannel的关闭
通过调用ServerSocketChannel.close() 方法来关闭ServerSocketChannel:
ServerSocketChannel serverSocketChannel = ServerSocketChannel.close();
ServerSocketChannel的监听
- 通过调用ServerSocketChannel.accept()方法来监听新进来的连接
- accept() 方法返回一个包含新进来的连接的SocketChannel. 因此 ,accept() 方法会一直阻塞到有新连接到达
通常情况下 ,ServerSocketChannel.accept() 不会仅仅只监听一个连接,所以在while循环中调用accept() 方法:
while (true) {
SocketChannel socketChannel = serverSocketChannel.accept();
...
}
可以在while循环的条件中,使用除了true以外的其余退出原则
非阻塞模式
- ServerSocket可以设置成非阻塞模式
在非阻塞模式下的ServerSocketChannel.accept() 方法会立刻返回:
- 如果还没有新进来的连接,返回null
- 因此,需要检查返回的SocketChannel是否为null
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().bind(new InetSocketAddress(8888));
serverSocketChannel.configureBlocking(false);while (true) {
SocketChannel socketChannel = serverSocketChannel.accept();
if (socketChannel != null) {
...
}
}
还没有评论,来说两句吧...