模块 java.base

类 AsynchronousServerSocketChannel

java.lang.Object
java.nio.channels.AsynchronousServerSocketChannel
所有已实现的接口:
Closeable , AutoCloseable , AsynchronousChannel , Channel , NetworkChannel

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

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

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

使用 setOption 方法配置套接字选项。这种类型的通道支持以下选项:

套接字选项
选项名称 Description
SO_RCVBUF 套接字接收缓冲区的大小
SO_REUSEADDR 重复使用地址
还可以支持其他(特定于实现的)选项。

使用示例:

 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

      打开异步服务套接字通道。

      通过在创建给定组的 AsynchronousChannelProvider 对象上调用 openAsynchronousServerSocketChannel 方法来创建新通道。如果组参数为 null,则生成的通道由系统范围的默认提供程序创建,并绑定到 default group

      参数:
      group - 新建通道应绑定到的组,或 null 用于默认组
      返回:
      一个新的异步服务套接字通道
      抛出:
      ShutdownChannelGroupException - 如果通道组关闭
      IOException - 如果发生 I/O 错误
    • open

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

      此方法返回绑定到 default group 的异步服务套接字通道。此方法等效于计算表达式:

       open((AsynchronousChannelGroup)null);
       
      返回:
      一个新的异步服务套接字通道
      抛出:
      IOException - 如果发生 I/O 错误
    • bind

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

      调用此方法等效于以下内容:

       bind(local, 0);
       
      指定者:
      bind 在接口 NetworkChannel
      参数:
      local - 绑定套接字的本地地址,或 null 绑定到自动分配的套接字地址
      返回:
      这个通道
      抛出:
      AlreadyBoundException - 如果套接字已经绑定
      UnsupportedAddressTypeException - 如果不支持给定地址的类型
      SecurityException - 如果安装了安全管理器并且它拒绝未指定的权限。此接口的实现应指定任何所需的权限。
      ClosedChannelException - 如果通道关闭
      IOException - 如果发生其他 I/O 错误
      参见:
    • bind

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

      此方法用于在套接字和本地地址之间建立关联。一旦建立关联,套接字将保持绑定状态,直到关联的通道关闭。

      backlog 参数是套接字上挂起连接的最大数量。它的确切语义是特定于实现的。特别是,一个实现可能会施加最大长度,或者可能会选择完全忽略该参数。如果 backlog 参数的值为 0 或负值,则使用特定于实现的默认值。

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

      public abstract <T> AsynchronousServerSocketChannel  setOption(SocketOption <T> name, T value) throws IOException
      从接口 NetworkChannel 复制的描述
      设置套接字选项的值。
      指定者:
      setOption 在接口 NetworkChannel
      类型参数:
      T - 套接字选项值的类型
      参数:
      name - 套接字选项
      value - 套接字选项的值。 null 的值可能是某些套接字选项的有效值。
      返回:
      这个通道
      抛出:
      IllegalArgumentException - 如果该值不是此套接字选项的有效值
      ClosedChannelException - 如果此通道关闭
      IOException - 如果发生 I/O 错误
      参见:
    • accept

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

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

      当接受新连接时,生成的 AsynchronousSocketChannel 将绑定到与此通道相同的 AsynchronousChannelGroup 。如果该组是 shutdown 并且接受了一个连接,则连接将关闭,操作将以 IOException 完成并导致 ShutdownChannelGroupException

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

      如果安装了安全管理器,则它会验证连接远程端点的地址和端口号是否为安全管理器的checkAccept 方法所允许。权限检查是使用受此方法的调用上下文限制的权限执行的。如果权限检查失败,则连接关闭,操作以 SecurityException 完成。

      类型参数:
      A - 附件类型
      参数:
      attachment - 附加到 I/O 操作的对象;可以是null
      handler - 使用结果的处理程序
      抛出:
      AcceptPendingException - 如果接受操作已经在这个通道上进行
      NotYetBoundException - 如果此通道的套接字尚未绑定
      ShutdownChannelGroupException - 如果通道组已终止
    • accept

      public abstract Future <AsynchronousSocketChannel > accept()
      接受连接。

      此方法启动异步操作以接受与此通道的套接字建立的连接。该方法的行为方式与 accept(Object, CompletionHandler) 方法完全相同,只是该方法不指定完成处理程序,而是返回一个 Future 表示未决结果。 Futureget 方法在成功完成后将 AsynchronousSocketChannel 返回到新连接。

      返回:
      代表未决结果的 Future 对象
      抛出:
      AcceptPendingException - 如果接受操作已经在这个通道上进行
      NotYetBoundException - 如果此通道的套接字尚未绑定
    • getLocalAddress

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

      如果通道是 bound 到 Internet 协议套接字地址,则此方法的返回值是 InetSocketAddress 类型。

      如果设置了安全管理器,则以本地地址和-1作为参数调用其checkConnect方法,以查看是否允许该操作。如果不允许该操作,则返回表示 loopback 地址和通道套接字的本地端口的 SocketAddress

      指定者:
      getLocalAddress 在接口 NetworkChannel
      返回:
      套接字绑定到的SocketAddress,或者如果被安全管理器拒绝则代表环回地址的SocketAddress,或者如果通道的套接字未绑定则为null
      抛出:
      ClosedChannelException - 如果通道关闭
      IOException - 如果发生 I/O 错误