专栏首页悠扬前奏的博客Java NIO-9.ServerSocketChannel

Java NIO-9.ServerSocketChannel

Java NIO ServerSocketChannel是一个能够监听新进TCP连接的通道,就像标准Java网络连接中的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...
}

打开ServerSocketChannel

调用ServerSocketChannel.open()方法打开一个ServerSocketChannel,例如:

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

关闭ServerSocketChannel

调用ServerSocketChannel.close()方法关闭ServerSocketChannel,例如

serverSocketChannel.close();

监听新进连接

监听新进连接是通过调用ServerSocketChannel.accept()方法实现的。accept()方法返回一个带有新进连接的SocketChannel。因此accept()方法在新进连接到达之前一直处于阻塞状态。 通常不会只监听单个连接,而是在while循环中调用accept()方法:

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

    //do something with socketChannel...
}

当然,也可以在while循环中使用除了true意外的其他退出准则。

非阻塞模式

ServerSocketChannel可以设置为非阻塞模式,此时accept立即返回,没有新进连接到达就返回空。因此需要检查返回的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...
        }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Groovy-18.模板引擎

    使用SimpleTemplateEngine类可以再模板中使用类似JSP的scriptlet和EL表达式,用来生成参数化文本。 模板引擎允许绑定参数列表以及值...

    悠扬前奏
  • Guava-1.6类CharMatcher

    com.google.common.base Class CharMatcher

    悠扬前奏
  • Groovy-16.数据库

    UPDATE和DELETE操作都是写好SQL然后通过execute执行,但是需要commit()提交(在后文“提交”中介绍)。

    悠扬前奏
  • Java NIO 系列学习 10 - ServerSocketChannel

    ServerSocketChannel 可以监听传入的TCP连接,与Java标准库的ServerSocket类似。

    许杨淼淼
  • 【Java SE】Java NIO系列教程(九) ServerSocketChannel

    英文:Jakob Jenkov 译文:ifeve - 郑玉婷 链接:http://ifeve.com/server-socket-channel/ Java N...

    用户1257215
  • 使用Lambda和API网关在Java中开发RESTful微服务

    原题:Developing RESTful APIs in Java using Amazon APIGateway and AWS Lambda

    yuanyi928
  • Java NIO

    0 <= mark <= position <= limit <= capacity

    张申傲
  • Netty之JavaNIO编程模型介绍02

      NIO 非阻塞 网络编程相关的(Selector、SelectionKey、ServerScoketChannel和SocketChannel) 关系梳理图

    用户4919348
  • DPI深度报文检测架构及关键技术实现

    当前DPI(Deep Packet Inspect深度报文识别)技术是安全领域的关键技术点之一,围绕DPI技术衍生出的安全产品类型也非常的多样。在分析DPI的进...

    SDNLAB
  • 7个角度进行nginx性能优化

    在大多数情况下,一个常规安装的Nginx对网站来说已经能很好地工作了。然而如果想挤压出Nginx的性能,就需要了解哪些指令会影响Nginx性能,在本文中将解释N...

    后端技术探索

扫码关注云+社区

领取腾讯云代金券