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

Class ServerSocketChannel

  • All Implemented Interfaces:
    CloseableAutoCloseableChannelInterruptibleChannelNetworkChannel


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

    通过调用此类的open方法创建服务器套接字通道。 不可能为任意的,预先存在的ServerSocket创建一个通道。 新创建的服务器套接字通道已打开但尚未绑定。 尝试调用未绑定服务器套接字通道的accept方法将导致抛出NotYetBoundException 可以通过调用此类定义的一个bind方法来绑定服务器套接字通道。

    套接字选项使用setOption方法进行配置。 服务器端口通道支持以下选项:

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

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

    从以下版本开始:
    1.4
    • 构造方法详细信息

      • ServerSocketChannel

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

      • open

        public static ServerSocketChannel open​()
                                        throws IOException
        打开服务器插槽通道。

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

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

        结果
        一个新的套接字通道
        异常
        IOException - 如果发生I / O错误
      • validOps

        public final int validOps​()
        返回确定此频道支持的操作的操作集。

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

        Specified by:
        validOpsSelectableChannel
        结果
        有效操作集
      • bind

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

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

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

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

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

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

        结果
        与此通道关联的服务器套接字
      • accept

        public abstract SocketChannel accept​()
                                      throws IOException
        接受与此频道套接字的连接。

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

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

        该方法执行与ServerSocket类的accept方法完全相同的安全检查。 也就是说,如果已经安装了一个安全管理器,那么对于每个新的连接,该方法将通过安全管理器的checkAccept方法验证连接的远程端点的地址和端口号是否被允许。

        结果
        新连接的套接字通道,或 null如果此通道处于非阻塞模式,并且没有连接可用于接受
        异常
        ClosedChannelException - 如果此通道关闭
        AsynchronousCloseException - 如果另一个线程在接受操作进行过程中关闭此通道
        ClosedByInterruptException - 如果另一个线程在接受操作进行过程中中断当前线程,从而关闭通道并设置当前线程的中断状态
        NotYetBoundException - 如果此通道的套接字尚未绑定
        SecurityException - 如果已安装安全管理器,并且不允许访问新连接的远程端点
        IOException - 如果发生其他I / O错误
      • getLocalAddress

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

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

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

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