在 Java NIO 中的 ServerSocketChannel 是用于监听新连接的 TCP 通道, 就像标准 IO 中的 ServerSocket 一样。ServerSocketChannel 类在 java.nio.channels包中。

阅读文章的过程中如果有任何疑问,欢迎添加笔者为好友,拉您进【七日书摘】微信交流群,一起交流技术,一起打造高质量的职场技术交流圈子,抱团取暖,共同进步。
七日书摘官方群.jpg

示例程序如下:

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

serverSocketChannel.socket().bind(new InetSocketAddress(9999));

while(true){
    SocketChannel socketChannel =
            serverSocketChannel.accept();

    //do something with socketChannel...
}

打开 ServerSocketChannel(Opening a ServerSocketChannel)

通过调用 ServerSocketChannel.open() 方法来打开 ServerSocketChannel。示例如下:

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

关闭 ServerSocketChannel(Closing a ServerSocketChannel)

通过调用 ServerSocketChannel.close() 方法来关闭 ServerSocketChannel。示例如下:

serverSocketChannel.close();

监听新请求的连接(Listening for Incoming Connections)

通过调用 ServerSocketChannel.accept() 方法监听端口上新进来的连接。当 accept()方法返回的时候,它返回一个包含新请求的连接 SocketChannel 实例。因此 accept() 是阻塞操作,他会阻塞线程直到返回一个连接; 很多时候我们是不满足于监听一个连接的,因此我们会把accept()的调用放到循环中,就像这样:

while(true){
    SocketChannel socketChannel =
            serverSocketChannel.accept();

    //do something with socketChannel...
}

当然我们可以在循环体内加上合适的中断逻辑,而不是单纯的在 while 循环中写 true,以此来结束循环监听。

非阻塞模式(Non-blocking Mode)

实际上 ServerSocketChannel 是可以设置为非阻塞模式的。在非阻塞模式下,调用 accept() 函数会立刻返回,如果当前没有新请求的链接,那么返回值为空 null。因此我们需要手动检查返回的 SocketChannel 是否为 null,示例如下:

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...
        }
}

英文原文链接:http://tutorials.jenkov.com/java-nio/socketchannel.html

------完------

推荐阅读:

Java NIO 简明教程 之 Java NIO Scatter/Gather

Java NIO 简明教程 之 Java NIO 通道之间的数据传输(Channel to Channel Transfers)

Java NIO 简明教程 之 Java NIO 选择器(Selector)

Java NIO 简明教程 之 Java NIO 文件通道(FileChannel)

Java NIO 简明教程 之 Java NIO 套接字通道(SocketChannel)

Java基础知识面试题篇(2020年2月最新版)

更技术学习请进入七日书摘官方群: 七日书摘官方群

七日书摘官方群群聊二维码.png

参考资源:
https://blog.csdn.net/Andrew_Yuan/article/details/80215164
https://wiki.jikexueyuan.com/project/java-nio-zh/java-nio-socketchannel.html