Module java.base

Class ServerSocketChannel

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

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

通过调用此类的open方法之一来创建服务器套接字通道。无参数的open方法为Internet协议套接字打开服务器套接字通道。使用open(ProtocolFamily)方法来为指定协议族的套接字打开服务器套接字通道。不可能为任意预先存在的套接字创建通道。新创建的服务器套接字通道是打开的,但尚未绑定。尝试调用未绑定的服务器套接字通道的accept方法将导致抛出NotYetBoundException。可以通过调用此类定义的一个bind方法之一来绑定服务器套接字通道。

使用setOption方法配置套接字选项。用于Internet协议套接字的服务器套接字通道支持以下选项:

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

用于Unix域套接字的服务器套接字通道支持:

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

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

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

自:
1.4
  • Constructor Details

    • ServerSocketChannel

      protected ServerSocketChannel(SelectorProvider provider)
      初始化此类的新实例。
      参数:
      provider - 创建此通道的提供程序
  • Method Details

    • open

      public static ServerSocketChannel open() throws IOException
      Internet协议套接字打开服务器套接字通道。

      通过调用系统范围内默认的openServerSocketChannel方法创建新通道。

      新通道的套接字最初未绑定;必须通过其套接字的一个bind方法将其绑定到特定地址,然后才能接受连接。

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

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

      通过调用系统范围内默认的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
      将通道套接字绑定到本地地址并配置套接字以侦听连接。

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

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

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

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

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

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

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

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

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

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

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

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