Java NIO(十) ServerSocketChannel

Java NIO ServerSocketChannel是一个可以侦听传入TCP连接的通道,就像标准Java Networking中的ServerSocket一样。 ServerSocketChannel类位于java.nio.channels包中。
这是一个例子:

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

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

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

    //do something with socketChannel...
}

Opening a ServerSocketChannel

通过调用ServerSocketChannel.open()方法打开一个ServerSocketChannel。 这是如何看起来如此:

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

Closing a ServerSocketChannel

关闭ServerSocketChannel是通过调用ServerSocketChannel.close()方法完成的。 这是如何看起来如此:

serverSocketChannel.close();

监听传入的连接

监听传入的连接是通过调用ServerSocketChannel.accept()方法完成的。 accept()方法返回时,它将返回一个带有传入连接的SocketChannel。 因此,accept()方法阻塞,直到传入的连接到达。

由于您通常不希望只听一个连接,所以您可以在while循环中调用accept()。 这是如何看起来如此:

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

    //do something with socketChannel...
}

当然,你会在while循环中使用其他的停止标准。

非阻塞模式

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...
        }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java I...
    JackChen1024阅读 12,232评论 1 143
  • 前言: 之前的文章《Java文件IO常用归纳》主要写了Java 标准IO要注意的细节和技巧,由于网上各种学习途径,...
    androidjp阅读 8,159评论 0 22
  • 简介 Java NIO 是由 Java 1.4 引进的异步 IO.Java NIO 由以下几个核心部分组成: Ch...
    永顺阅读 5,748评论 0 15
  • (转载说明:本文非原创,转载自http://ifeve.com/java-nio-all/) Java NIO: ...
    柳岸阅读 4,221评论 0 3
  • 1.为什么要有分代的概念,不分代行不行 不分代完全可以,但是分代的唯一理由是为了优化GC性能。怎么优化?如果不进行...
    咪雅先森阅读 2,985评论 0 1