模块 java.base

类 ServerSocketChannel

所有已实现的接口:
Closeable , AutoCloseable , Channel , InterruptibleChannel , NetworkChannel

public abstract class ServerSocketChannel extends AbstractSelectableChannel implements NetworkChannel
面向流的监听套接字的可选通道。

服务套接字通道是通过调用此类的 open 方法之一创建的。 no-arg open 方法打开一个服务套接字通道互联网协议插座。 open(ProtocolFamily) 方法用于为指定协议族的套接字打开服务套接字通道。不可能为任意的、预先存在的套接字创建通道。新创建的服务套接字通道已打开但尚未绑定。尝试调用未绑定服务套接字通道的 accept 方法将导致抛出 NotYetBoundException 。可以通过调用此类定义的 bind 方法之一来绑定服务套接字通道。

使用 setOption 方法配置套接字选项。服务套接字通道互联网协议套接字支持以下选项:

套接字选项
选项名称 Description
SO_RCVBUF 套接字接收缓冲区的大小
SO_REUSEADDR 重复使用地址

服务套接字通道Unix域套接字支持:

套接字选项
选项名称 Description
SO_RCVBUF 套接字接收缓冲区的大小

还可以支持其他(特定于实现的)选项。

服务套接字通道可以安全地供多个并发线程使用。

自从:
1.4
  • 构造方法详细信息

    • ServerSocketChannel

      protected ServerSocketChannel(SelectorProvider  provider)
      初始化此类的新实例。
      参数:
      provider - 创建此通道的提供商
  • 方法详情

    • open

      public static ServerSocketChannel  open() throws IOException
      打开服务套接字通道互联网协议socket。

      新通道是通过调用系统范围默认 SelectorProvider 对象的 openServerSocketChannel 方法创建的。

      新通道的套接字最初是未绑定的;在接受连接之前,它必须通过其套接字的 bind 方法之一绑定到特定地址。

      返回:
      一个新的套接字通道
      抛出:
      IOException - 如果发生 I/O 错误
      参见:
    • open

      public static ServerSocketChannel  open(ProtocolFamily  family) throws IOException
      打开服务套接字通道。 family 参数指定通道套接字的 protocol family

      新通道是通过调用系统范围默认 SelectorProvider 对象的 openServerSocketChannel(ProtocolFamily) 方法创建的。

      参数:
      family - 协议族
      返回:
      一个新的套接字通道
      抛出:
      UnsupportedOperationException - 如果不支持指定的协议系列。例如,假设参数指定为 StandardProtocolFamily.INET6 但平台上未启用 IPv6。
      IOException - 如果发生 I/O 错误
      自从:
      15
      参见:
    • validOps

      public final int validOps()
      返回标识此通道支持的操作的操作集。

      服务套接字通道仅支持接受新连接,因此此方法返回 SelectionKey.OP_ACCEPT

      指定者:
      validOps 在类 SelectableChannel
      返回:
      有效操作集
    • bind

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

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

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

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

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

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

      API 注意:
      绑定服务套接字通道Unix域套接字,创建一个与 UnixDomainSocketAddress 中的文件路径对应的文件。该文件在通道关闭后仍然存在,并且必须在另一个套接字可以绑定到相同名称之前将其删除。绑定到 null 地址会导致套接字自动地绑定到系统临时位置中的某个唯一文件。关联的套接字文件在通道关闭后也会保留。它的名称可以从通道的本地套接字地址获得。
      实现注意事项:
      每个平台都强制执行特定于实现的名称的最大长度Unix域socket。绑定通道时会强制执行此限制。最大长度通常接近且一般不少于 100 字节。此限制也适用于自动地绑定服务套接字通道。见Unix域网络属性 可用于选择创建这些套接字的临时目录。
      参数:
      local - 绑定套接字的地址,或 null 绑定到自动分配的套接字地址
      backlog - 最大挂起连接数
      返回:
      这个通道
      抛出:
      AlreadyBoundException - 如果套接字已经绑定
      UnsupportedAddressTypeException - 如果不支持给定地址的类型
      ClosedChannelException - 如果此通道关闭
      IOException - 如果发生其他 I/O 错误
      SecurityException - 如果安装了安全管理器并且它的 checkListen 方法拒绝了一个操作互联网协议套接字地址,或一个Unix域套接字地址,如果它拒绝 NetPermission ("accessUnixDomainSocket")
      自从:
      1.7
    • setOption

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

      public abstract ServerSocket  socket()
      检索与此通道关联的服务套接字。

      返回的对象不会声明任何未在 ServerSocket 类中声明的公共方法。

      返回:
      与此通道关联的服务套接字
      抛出:
      UnsupportedOperationException - 如果通道的套接字不是互联网协议socket
    • accept

      public abstract SocketChannel  accept() throws IOException
      接受与此通道的套接字建立的连接。

      如果此通道处于非阻塞模式,那么如果没有挂起的连接,此方法将立即返回 null。否则它将无限期阻塞,直到有可用的新连接或发生 I/O 错误。

      此方法返回的套接字通道(如果有)将处于阻塞模式,而不管此通道的阻塞模式如何。

      如果绑定到互联网协议套接字地址,此方法执行与 ServerSocket 类的 accept 方法完全相同的安全检查。也就是说,如果安装了安全管理器,那么对于每个新连接,此方法都会验证安全管理器的 checkAccept 方法是否允许连接远程端点的地址和端口号。如果绑定到Unix域套接字地址,此方法检查 NetPermission ("accessUnixDomainSocket")

      返回:
      新连接的套接字通道,或者 null 如果此通道处于非阻塞模式并且没有可用的连接被接受
      抛出:
      ClosedChannelException - 如果此通道关闭
      AsynchronousCloseException - 如果另一个线程在接受操作正在进行时关闭此通道
      ClosedByInterruptException - 如果另一个线程在accept操作进行时中断当前线程,从而关闭通道并设置当前线程的中断状态
      NotYetBoundException - 如果此通道的套接字尚未绑定
      SecurityException - 如果已安装安全管理器并且此通道绑定到 InetSocketAddress 并且安全管理器拒绝访问新连接的远程端点,或者如果此通道绑定到 UnixDomainSocketAddress 并且安全管理器拒绝 NetPermission ("accessUnixDomainSocket")
      IOException - 如果发生其他 I/O 错误
    • getLocalAddress

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

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

      通道绑定到的地方Unix域套接字地址,套接字地址是一个UnixDomainSocketAddress 。如果设置了安全管理器,则使用 NetPermission ("accessUnixDomainSocket") 调用其 checkPermission 方法。如果不允许该操作,则返回未命名的 UnixDomainSocketAddress

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