模块  java.base
软件包  java.net

Class ServerSocket

  • 实现的所有接口
    CloseableAutoCloseable
    已知直接子类:
    SSLServerSocket

    public class ServerSocket
    extends Object
    implements Closeable
    该类实现服务器套接字。 服务器套接字等待通过网络进入的请求。 它根据该请求执行某些操作,然后可能将结果返回给请求者。

    服务器套接字的实际工作由SocketImpl类的实例执行。 应用程序可以更改创建套接字实现的套接字工厂,以配置自身以创建适合本地防火墙的套接字。

    从以下版本开始:
    1.0
    另请参见:
    SocketImplsetSocketFactory(java.net.SocketImplFactory)ServerSocketChannel
    • 构造方法详细信息

      • ServerSocket

        public ServerSocket()
                     throws IOException
        创建未绑定的服务器套接字。
        异常
        IOException - 打开套接字时出现IO错误。
      • ServerSocket

        public ServerSocket​(int port)
                     throws IOException
        创建绑定到指定端口的服务器套接字。 端口号0表示端口号自动分配,通常来自临时端口范围。 然后可以通过调用getLocalPort来检索此端口号。

        传入连接指示(连接请求)的最大队列长度设置为50 如果队列已满时连接指示到达,则拒绝连接。

        如果应用程序指定了服务器套接字工厂,则调用该工厂的createSocketImpl方法以创建实际的套接字实现。 否则会创建一个“普通”套接字。

        如果存在安全管理器,则使用port参数作为其参数调用其checkListen方法,以确保允许操作。 这可能会导致SecurityException。

        参数
        port - 端口号,或 0以使用自动分配的端口号。
        异常
        IOException - 如果在打开套接字时发生I / O错误。
        SecurityException - 如果存在安全管理器且其 checkListen方法不允许该操作。
        IllegalArgumentException - 如果port参数超出指定的有效端口值范围,则介于0和65535之间(包括0和65535)。
        另请参见:
        SocketImplSocketImplFactory.createSocketImpl()setSocketFactory(java.net.SocketImplFactory)SecurityManager.checkListen(int)
      • ServerSocket

        public ServerSocket​(int port,
                            int backlog)
                     throws IOException
        创建服务器套接字并使用指定的待办事项将其绑定到指定的本地端口号。 端口号0表示通常从临时端口范围自动分配端口号。 然后,可以通过调用getLocalPort来检索此端口号。

        传入连接指示(连接请求)的最大队列长度设置为backlog参数。 如果队列已满时连接指示到达,则拒绝连接。

        如果应用程序指定了服务器套接字工厂,则调用该工厂的createSocketImpl方法以创建实际的套接字实现。 否则会创建一个“普通”套接字。

        如果存在安全管理器,则使用port参数作为其参数调用其checkListen方法,以确保允许操作。 这可能会导致SecurityException。 backlog参数是套接字上请求的最大挂起连接数。 它的确切语义是特定于实现的。 特别地,实现可以施加最大长度或者可以选择忽略参数altogther。 提供的值应大于0 如果它小于或等于0 ,则将使用特定于实现的默认值。

        参数
        port - 端口号,或 0以使用自动分配的端口号。
        backlog - 请求传入连接队列的最大长度。
        异常
        IOException - 如果打开套接字时发生I / O错误。
        SecurityException - 如果存在安全管理器且其 checkListen方法不允许该操作。
        IllegalArgumentException - 如果port参数超出指定的有效端口值范围,则介于0和65535之间(包括0和65535)。
        另请参见:
        SocketImplSocketImplFactory.createSocketImpl()setSocketFactory(java.net.SocketImplFactory)SecurityManager.checkListen(int)
      • ServerSocket

        public ServerSocket​(int port,
                            int backlog,
                            InetAddress bindAddr)
                     throws IOException
        创建具有指定端口的服务器,监听backlog和要绑定的本地IP地址。 bindAddr参数可以在多宿主主机上用于ServerSocket,它只接受对其某个地址的连接请求。 如果bindAddr为null,它将默认接受任何/所有本地地址上的连接。 端口必须介于0到65535之间(包括0和65535)。 端口号0表示通常从临时端口范围自动分配端口号。 然后,可以通过致电getLocalPort检索此端口号。

        如果存在安全管理器,则此方法将使用port参数作为其参数调用其checkListen方法,以确保允许该操作。 这可能会导致SecurityException。 backlog参数是套接字上请求的最大挂起连接数。 它的确切语义是特定于实现的。 特别地,实现可以施加最大长度或者可以选择忽略参数altogther。 提供的值应大于0 如果它小于或等于0 ,则将使用特定于实现的默认值。

        参数
        port - 端口号,或 0以使用自动分配的端口号。
        backlog - 请求传入连接队列的最大长度。
        bindAddr - 服务器将绑定到的本地InetAddress
        异常
        SecurityException - 如果存在安全管理器且其 checkListen方法不允许该操作。
        IOException - 如果在打开套接字时发生I / O错误。
        IllegalArgumentException - 如果port参数超出指定的有效端口值范围,则介于0和65535之间(包括0和65535)。
        从以下版本开始:
        1.1
        另请参见:
        SocketOptionsSocketImplSecurityManager.checkListen(int)
    • 方法详细信息

      • bind

        public void bind​(SocketAddress endpoint)
                  throws IOException
        ServerSocket绑定到特定地址(IP地址和端口号)。

        如果地址是null ,则系统将获取临时端口和有效的本地地址以绑定套接字。

        参数
        endpoint - 要绑定的IP地址和端口号。
        异常
        IOException - 如果绑定操作失败,或者套接字已绑定。
        SecurityException - 如果存在 SecurityManager且其 checkListen方法不允许该操作。
        IllegalArgumentException - 如果endpoint是此套接字不支持的SocketAddress子类
        从以下版本开始:
        1.4
      • bind

        public void bind​(SocketAddress endpoint,
                         int backlog)
                  throws IOException
        ServerSocket绑定到特定地址(IP地址和端口号)。

        如果地址是null ,则系统将获取临时端口和有效的本地地址以绑定套接字。

        backlog参数是套接字上请求的最大挂起连接数。 它的确切语义是特定于实现的。 特别地,实现可以施加最大长度或者可以选择忽略参数altogther。 提供的值应大于0 如果它小于或等于0 ,则将使用特定于实现的默认值。

        参数
        endpoint - 要绑定的IP地址和端口号。
        backlog - 请求传入连接队列的最大长度。
        异常
        IOException - 如果绑定操作失败,或者套接字已绑定。
        SecurityException - 如果存在 SecurityManager且其 checkListen方法不允许该操作。
        IllegalArgumentException - 如果endpoint是此套接字不支持的SocketAddress子类
        从以下版本开始:
        1.4
      • getInetAddress

        public InetAddress getInetAddress()
        返回此服务器套接字的本地地址。

        如果套接字在closed之前被绑定 ,则此方法将在套接字关闭后继续返回本地地址。

        如果存在安全管理器集,则使用本地地址和-1作为其参数调用其checkConnect方法,以查看是否允许该操作。 如果不允许该操作,则返回loopback地址。

        结果
        此套接字绑定的地址,或安全管理器拒绝的环回地址,如果套接字未绑定, null
        另请参见:
        SecurityManager.checkConnect(java.lang.String, int)
      • getLocalPort

        public int getLocalPort()
        返回此套接字正在侦听的端口号。

        如果套接字在closed之前被绑定 ,则此方法将在套接字关闭后继续返回端口号。

        结果
        此套接字正在侦听的端口号,如果套接字尚未绑定,则为-1。
      • getLocalSocketAddress

        public SocketAddress getLocalSocketAddress()
        返回此套接字绑定的端点的地址。

        如果套接字在closed之前被绑定 ,则此方法将在套接字关闭后继续返回端点的地址。

        如果存在安全管理器集,则使用本地地址和-1作为其参数调用其checkConnect方法,以查看是否允许该操作。 如果不允许该操作,则SocketAddress表示loopback地址的SocketAddress以及绑定套接字的本地端口。

        结果
        一个 SocketAddress表示此套接字的本地端点或 SocketAddress代表的环回地址,如果安全管理器拒绝,或 null如果套接字尚未绑定。
        从以下版本开始:
        1.4
        另请参见:
        getInetAddress()getLocalPort()bind(SocketAddress)SecurityManager.checkConnect(java.lang.String, int)
      • accept

        public Socket accept()
                      throws IOException
        侦听对此套接字的连接并接受它。 该方法将阻塞,直到建立连接。

        创建一个新的Socket s ,如果有安全管理器,则调用安全管理器的checkAccept方法,并以s.getInetAddress().getHostAddress()s.getPort()作为其参数,以确保允许操作。 这可能会导致SecurityException。

        结果
        新的Socket
        异常
        IOException - 如果在等待连接时发生I / O错误。
        SecurityException - 如果存在安全管理器且其 checkAccept方法不允许该操作。
        SocketTimeoutException - 如果先前使用setSoTimeout设置了超时并且已达到超时。
        IllegalBlockingModeException - 如果此套接字具有关联的通道,则通道处于非阻塞模式,并且没有准备接受的连接
        另请参见:
        SecurityManager.checkAccept(java.lang.String, int)
      • implAccept

        protected final void implAccept​(Socket s)
                                 throws IOException
        ServerSocket的子类使用此方法覆盖accept()以返回其自己的套接字子类。 因此,FooServerSocket通常会将此方法移交给空的 FooSocket。 从implAccept返回时,FooSocket将连接到客户端。
        参数
        s - 插座
        异常
        IllegalBlockingModeException - 如果此套接字具有关联的通道,并且该通道处于非阻塞模式
        IOException - 如果在等待连接时发生I / O错误。
        从以下版本开始:
        1.1
      • getChannel

        public ServerSocketChannel getChannel()
        返回与此套接字关联的唯一ServerSocketChannel对象(如果有)。

        当且仅当通道本身是通过ServerSocketChannel.open方法创建时,服务器套接字才会有通道。

        结果
        与此套接字关联的服务器套接字通道,如果未为通道创建此套接字, null
        从以下版本开始:
        1.4
      • isBound

        public boolean isBound()
        返回ServerSocket的绑定状态。
        结果
        如果ServerSocket成功绑定到某个地址,则为true
        从以下版本开始:
        1.4
      • isClosed

        public boolean isClosed()
        返回ServerSocket的关闭状态。
        结果
        如果套接字已关闭,则为true
        从以下版本开始:
        1.4
      • setSoTimeout

        public void setSoTimeout​(int timeout)
                          throws SocketException
        使用指定的超时启用/禁用SO_TIMEOUT ,以毫秒为单位。 如果将此选项设置为非零超时,则对此ServerSocket的accept()调用将仅阻止此时间。 如果超时到期,则引发java.net.SocketTimeoutException ,尽管ServerSocket仍然有效。 必须在进入阻止操作之前启用该选项才能生效。 超时必须是> 0 超时为零被解释为无限超时。
        参数
        timeout - 指定的超时,以毫秒为单位
        异常
        SocketException - 如果底层协议中存在错误,例如TCP错误。
        从以下版本开始:
        1.1
        另请参见:
        getSoTimeout()
      • setReuseAddress

        public void setReuseAddress​(boolean on)
                             throws SocketException
        启用/禁用SO_REUSEADDR套接字选项。

        当TCP连接关闭时,连接可能会在连接关闭后的一段时间内保持超时状态(通常称为TIME_WAIT状态或2MSL等待状态)。 对于使用众所周知的套接字地址或端口的应用程序,如果在涉及套接字地址或端口的超时状态中存在连接,则可能无法将套接字绑定到所需的SocketAddress

        在使用bind(SocketAddress)绑定套接字之前启用SO_REUSEADDR允许套接字绑定,即使先前的连接处于超时状态。

        创建ServerSocket时, ServerSocket初始设置SO_REUSEADDR 应用程序可以使用getReuseAddress()来确定初始设置SO_REUSEADDR

        未定义绑定套接字后启用或禁用SO_REUSEADDR时的行为(请参阅isBound() )。

        参数
        on - 是否启用或禁用套接字选项
        异常
        SocketException - 如果在启用或禁用 SO_REUSEADDR套接字选项时发生错误,或者套接字已关闭。
        从以下版本开始:
        1.4
        另请参见:
        getReuseAddress()bind(SocketAddress)isBound()isClosed()
      • toString

        public String toString()
        String返回此套接字的实现地址和实现端口。

        如果存在安全管理器集,则使用本地地址和-1作为其参数调用其checkConnect方法,以查看是否允许该操作。 如果不允许的操作, InetAddress表示loopback地址返回作为实现地址。

        重写:
        toString在类 Object
        结果
        此套接字的字符串表示形式。
      • setSocketFactory

        public static void setSocketFactory​(SocketImplFactory fac)
                                     throws IOException
        设置应用程序的服务器套接字实现工厂。 工厂只能指定一次。

        当应用程序创建新的服务器套接字时,将调用套接字实现工厂的createSocketImpl方法来创建实际的套接字实现。

        除非工厂已经设置,否则将null传递给该方法是无操作的。

        如果有安全管理器,则此方法首先调用安全管理器的checkSetFactory方法以确保允许操作。 这可能会导致SecurityException。

        参数
        fac - 所需的工厂。
        异常
        IOException - 如果在设置套接字工厂时发生I / O错误。
        SocketException - 如果已定义工厂。
        SecurityException - 如果存在安全管理器且其 checkSetFactory方法不允许该操作。
        另请参见:
        SocketImplFactory.createSocketImpl()SecurityManager.checkSetFactory()
      • setReceiveBufferSize

        public void setReceiveBufferSize​(int size)
                                  throws SocketException
        设置为默认建议值SO_RCVBUF选项从该接受的套接字ServerSocket 在接受的套接字中实际设置的值必须通过调用确定Socket.getReceiveBufferSize()插座被退回后accept()

        SO_RCVBUF的值用于设置内部套接字接收缓冲区的大小,以及设置广告到远程对等方的TCP接收窗口的大小。

        随后可以通过调用Socket.setReceiveBufferSize(int)更改该值。 然而,如果应用程序希望允许一个接收窗口大于64K字节的,如由RFC1323则建议值必须在将ServerSocket被设置之前它被绑定到一个本地地址定义。 这意味着必须使用无参数构造函数创建ServerSocket,然后必须调用setReceiveBufferSize(),最后通过调用bind()将ServerSocket绑定到地址。

        如果不这样做不会导致错误,并且缓冲区大小可能设置为请求的值,但从此ServerSocket接受的套接字中的TCP接收窗口将不大于64K字节。

        参数
        size - 设置接收缓冲区大小的大小。 该值必须大于0。
        异常
        SocketException - 如果底层协议中存在错误,例如TCP错误。
        IllegalArgumentException - 如果值为0或为负数。
        从以下版本开始:
        1.4
        另请参见:
        getReceiveBufferSize()
      • setPerformancePreferences

        public void setPerformancePreferences​(int connectionTime,
                                              int latency,
                                              int bandwidth)
        设置此ServerSocket的性能首选项。

        套接字默认使用TCP / IP协议。 一些实现可以提供具有与TCP / IP不同的性能特征的替代协议。 该方法允许应用程序表达自己的偏好,以便在实现从可用协议中选择时如何进行这些权衡。

        性能首选项由三个整数描述,其值表示短连接时间,低延迟和高带宽的相对重要性。 整数的绝对值是无关紧要的; 为了选择协议,简单地比较值,较大的值表示较强的偏好。 例如,如果应用程序优先考虑低延迟和高带宽的短连接时间,那么它可以使用值(1, 0, 0)调用此方法。 如果应用程序在低延迟之上更喜欢高带宽,而在短连接时间之上更喜欢低延迟,那么它可以使用值(0, 1, 2)调用此方法。

        绑定此套接字后调用此方法将不起作用。 这意味着要使用此功能,需要使用无参数构造函数创建套接字。

        参数
        connectionTime - 表示短连接时间的相对重要性的 int
        latency - 表达低延迟的相对重要性的 int
        bandwidth - 表示高带宽相对重要性的 int
        从以下版本开始:
        1.5
      • getOption

        public <T> T getOption​(SocketOption<T> name)
                        throws IOException
        返回套接字选项的值。
        参数类型
        T - 套接字选项值的类型
        参数
        name - 套接字选项
        结果
        套接字选项的值。
        异常
        UnsupportedOperationException - 如果服务器套接字不支持该选项。
        IOException - 如果发生I / O错误,或者套接字已关闭。
        NullPointerException - 如果名称是 null
        SecurityException - 如果设置了安全管理器,并且套接字选项需要安全权限,并且调用者没有所需的权限。 StandardSocketOptions不需要任何安全权限。
        从以下版本开始:
        9
      • supportedOptions

        public Set<SocketOption<?>> supportedOptions()
        返回此服务器套接字支持的一组套接字选项。 即使在套接字关闭后,此方法仍将继续返回选项集。
        结果
        此套接字支持的一组套接字选项。 如果无法创建套接字的SocketImpl,则此set可能为空。
        从以下版本开始:
        9