10. Java NIO ServerSocketChannel 服务端套接字通道

在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

打开一个ServerSocketChannel咱们须要调用他的open()方法,例如:网络

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

关闭ServerSocketChannel

关闭一个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...
    }
}
相关文章
相关标签/搜索