Java中的NIO详解Day09-ServerSocketChannel

痛定思痛。 2023-03-03 06:27 83阅读 0赞

ServerSocketChannel

  • 基本概念
  • ServerSocketChannel的开启
  • ServerSocketChannel的关闭
  • ServerSocketChannel的监听
  • 非阻塞模式

基本概念

  • Java NIO中的ServerSocketChannel是一个可以监听新进来的TCP连接通道,类似标准IO中的ServerSocket
  • ServerSocketChannel类在java.nio.channels包中

    ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
    serverSocketChannel.socket().bind(new InetSocketAddress(8000));
    while (true) {

    1. SocketChannel socketChannel = serverSocketChannel.accept();
    2. // 关于SocketChannel的操作
    3. ...

    }

ServerSocketChannel的开启

  • 通过调用ServerSocketChannel.open() 方法来打开ServerSocketChannel:

    ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

ServerSocketChannel的关闭

  • 通过调用ServerSocketChannel.close() 方法来关闭ServerSocketChannel:

    ServerSocketChannel serverSocketChannel = ServerSocketChannel.close();

ServerSocketChannel的监听

  • 通过调用ServerSocketChannel.accept()方法来监听新进来的连接
  • accept() 方法返回一个包含新进来的连接的SocketChannel. 因此 ,accept() 方法会一直阻塞到有新连接到达
  • 通常情况下 ,ServerSocketChannel.accept() 不会仅仅只监听一个连接,所以在while循环中调用accept() 方法:

    while (true) {

    1. SocketChannel socketChannel = serverSocketChannel.accept();
    2. ...

    }

  • 可以在while循环的条件中,使用除了true以外的其余退出原则

非阻塞模式

  • ServerSocket可以设置成非阻塞模式
  • 在非阻塞模式下的ServerSocketChannel.accept() 方法会立刻返回:

    • 如果还没有新进来的连接,返回null
    • 因此,需要检查返回的SocketChannel是否为null

    ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
    serverSocketChannel.socket().bind(new InetSocketAddress(8888));
    serverSocketChannel.configureBlocking(false);

    while (true) {

    1. SocketChannel socketChannel = serverSocketChannel.accept();
    2. if (socketChannel != null) {
    3. ...
    4. }

    }

发表评论

表情:
评论列表 (有 0 条评论,83人围观)

还没有评论,来说两句吧...

相关阅读