专栏首页架构师之旅【Java SE】Java NIO系列教程(九) ServerSocketChannel

【Java SE】Java NIO系列教程(九) ServerSocketChannel

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

Java NIO中的 ServerSocketChannel 是一个可以监听新进来的TCP连接的通道, 就像标准IO中的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() 方法会立刻返回,如果还没有新进来的连接,返回的将是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... } }

本文分享自微信公众号 - 架构师之旅(TravelWithFrame)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-05-28

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【Java SE】Java NIO系列教程(八) SocketChannel

    英文:Jakob Jenkov 译文:ifeve - 郑玉婷 链接:http://ifeve.com/socket-channel/ Java NIO中的Soc...

    用户1257215
  • Redis提供的持久化机制(RDB和AOF)

     Redis是一种面向“key-value”类型数据的分布式NoSQL数据库系统,具有高性能、持久存储、适应高并发应用场景等优势。它虽然起步较晚,但发展却十分迅...

    用户1257215
  • 【Java SE】Java NIO系列教程(三) Buffer

    Java NIO中的Buffer用于和NIO通道进行交互。如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的。 缓冲区本质上是一块可以写入数据,然后可以从...

    用户1257215
  • Java NIO 系列学习 10 - ServerSocketChannel

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

    许杨淼淼
  • Java NIO-9.ServerSocketChannel

    Java NIO ServerSocketChannel是一个能够监听新进TCP连接的通道,就像标准Java网络连接中的ServerSocket。ServerS...

    悠扬前奏
  • 使用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...

    后端技术探索

扫码关注云+社区

领取腾讯云代金券