在Java NIO中,ServerSocketChannel是用于监听TCP连接请求的通道,正如Java网络编程中的ServerSocket同样。java
ServerSocketChannel实现类位于java.nio.channels包下面。 下面是一个示例程序:编程
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.socket().bin(new InetSocketAddress(9999)); while(true) { SocketChannel socketChannel = serverSocketChannel.accept(); //do something with socketChannel... }
打开一个ServerSocketChannel咱们须要调用他的open()方法,例如:网络
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
关闭一个ServerSocketChannel咱们须要调用他的close()方法,例如:socket
serverSocketChannel.close();
经过调用accept()方法,咱们就开始监听端口上的请求链接。当accept()返回时,他会返回一个SocketChannel链接实例,实际上accept()是阻塞操做,他会阻塞带去线程知道返回一个链接; 不少时候咱们是不知足于监听一个链接的,所以咱们会把accept()的调用放到循环中,就像这样:函数
while(true){ SocketChannel socketChannel = serverSocketChannel.accept(); //do something with socketChannel... }
固然咱们能够在循环体内加上合适的中断逻辑,而不是单纯的在while循环中写true,以此来结束循环监听;spa
实际上ServerSocketChannel是能够设置为非阻塞模式的。在非阻塞模式下,调用accept()函数会马上返回,若是当前没有请求的连接,那么返回值为空null。所以咱们须要手动检查返回的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... } }