Module  java.base
软件包  java.nio.channels

Class AsynchronousServerSocketChannel

  • All Implemented Interfaces:
    CloseableAutoCloseableAsynchronousChannelChannelNetworkChannel


    public abstract class AsynchronousServerSocketChannel
    extends Object
    implements AsynchronousChannel, NetworkChannel
    用于面向流的侦听套接字的异步通道。

    通过调用此类的open方法创建异步服务器套接字通道。 新创建的异步服务器套接字通道已打开但尚未绑定。 它可以绑定到本地地址,并配置为通过调用bind方法监听连接。 一旦绑定,则使用accept方法启动接受通道插座的连接。 在未绑定通道上调用accept方法的尝试将导致抛出NotYetBoundException

    这种类型的通道可以安全地被多个并发线程使用,尽管在任何时候最多只能接受一个操作。 如果线程在先前接受操作完成之前启动接受操作,那么将抛出一个AcceptPendingException

    套接字选项使用setOption方法进行配置。 此类型的频道支持以下选项:

    Socket options
    Option Name 描述
    SO_RCVBUF The size of the socket receive buffer
    SO_REUSEADDR Re-use address
    还可以支持附加(实现特定)选项。

    用法示例:

      final AsynchronousServerSocketChannel listener =
          AsynchronousServerSocketChannel.open().bind(new InetSocketAddress(5000));
    
      listener.accept(null, new CompletionHandler<AsynchronousSocketChannel,Void>() {
          public void completed(AsynchronousSocketChannel ch, Void att) {
              // accept the next connection
              listener.accept(null, this);
    
              // handle this connection
              handle(ch);
          }
          public void failed(Throwable exc, Void att) {
              ...
          }
      }); 
    从以下版本开始:
    1.7
    • 构造方法详细信息

      • AsynchronousServerSocketChannel

        protected AsynchronousServerSocketChannel​(AsynchronousChannelProvider provider)
        初始化此类的新实例。
        参数
        provider - 创建此频道的提供商
    • 方法详细信息

      • provider

        public final AsynchronousChannelProvider provider​()
        返回创建此通道的提供程序。
        结果
        创建此频道的提供商
      • open

        public static AsynchronousServerSocketChannel open​()
                                                    throws IOException
        打开异步服务器套接字通道。

        此方法返回绑定到默认组的异步服务器套接字通道。 此方法等效于评估表达式:

         open((AsynchronousChannelGroup)null);
         
        结果
        一个新的异步服务器插槽通道
        异常
        IOException - 如果发生I / O错误
      • bind

        public abstract AsynchronousServerSocketChannel bind​(SocketAddress local,
                                                             int backlog)
                                                      throws IOException
        将通道的套接字绑定到本地地址,并配置套接字以监听连接。

        该方法用于在套接字和本地地址之间建立关联。 一旦建立了关联,则套接字保持绑定,直到关联的信道被关闭。

        backlog参数是套接字上挂起的连接的最大数量。 其确切语义是实现具体的。 特别地,实现可以施加最大长度,或者可以选择忽略参数altogther。 如果backlog参数的值为0或负值,则使用实现特定的默认值。

        参数
        local - 绑定套接字的本地地址,或 null绑定到自动分配的套接字地址
        backlog - 挂起连接的最大数量
        结果
        这个频道
        异常
        AlreadyBoundException - 如果套接字已经绑定
        UnsupportedAddressTypeException - 如果不支持给定地址的类型
        SecurityException - 如果已安装安全管理员,并且其 checkListen方法拒绝操作
        ClosedChannelException - 如果通道关闭
        IOException - 如果发生其他I / O错误
      • accept

        public abstract <A> void accept​(A attachment,
                                        CompletionHandler<AsynchronousSocketChannel,? super A> handler)
        接受连接。

        此方法启动异步操作以接受对该通道的套接字进行的连接。 handler参数是一个完成处理程序,在连接被接受时被调用(或者操作失败)。 传递给完成处理程序的结果是新连接的AsynchronousSocketChannel

        当接受新的连接时,所产生的AsynchronousSocketChannel将被绑定到与该频道相同的AsynchronousChannelGroup 如果该基团是shutdown和连接被接受,则所述连接被关闭,并且操作与完成IOException并引起ShutdownChannelGroupException

        为了允许新连接的并发处理,当立即接受新连接时,完成处理程序不会被启动线程直接调用(请参阅Threading )。

        如果安装了一个安全管理器,那么它将通过安全管理器的checkAccept方法验证连接的远程端点的地址和端口号是否被允许。 权限检查由受此方法的调用上下文限制的权限执行。 如果权限检查失败,则连接被关闭,并且操作完成与一个SecurityException

        参数类型
        A - 附件的类型
        参数
        attachment - 要附加到I / O操作的对象; 可以是null
        handler - 消耗结果的处理程序
        异常
        AcceptPendingException - 如果此通道上已经接受了接受操作
        NotYetBoundException - 如果此通道的套接字尚未绑定
        ShutdownChannelGroupException - 如果通道组已终止
      • getLocalAddress

        public abstract SocketAddress getLocalAddress​()
                                               throws IOException
        返回此通道的套接字所绑定的套接字地址。

        通道为Internet协议套接字地址的bound ,则此方法的返回值为InetSocketAddress

        如果有一个安全管理器集,它的checkConnect方法被调用本地地址和-1作为参数来查看是否允许该操作。 如果不允许操作,则SocketAddress表示loopback地址的SocketAddress和通道插座的本地端口。

        Specified by:
        getLocalAddress接口 NetworkChannel
        结果
        SocketAddress的套接字绑定到,或 SocketAddress代表的环回地址,如果安全管理器拒绝,或者 null如果通道的套接字不绑定
        异常
        ClosedChannelException - 如果通道关闭
        IOException - 如果发生I / O错误