模块 java.base
 java.net

类 ServerSocket

java.lang.Object
java.net.ServerSocket
所有已实现的接口:
Closeable , AutoCloseable
已知子类:
SSLServerSocket

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

服务套接字的实际工作由 SocketImpl 类的实例执行。

ServerSocket 类定义了设置和获取多个套接字选项的便捷方法。此类还定义了 setOption getOption 方法来设置和查询套接字选项。 ServerSocket 支持以下选项:

套接字选项
选项名称 Description
SO_RCVBUF 套接字接收缓冲区的大小
SO_REUSEADDR 重复使用地址
还可以支持其他(特定于实现的)选项。
自从:
1.0
参见:
  • 构造方法详细信息

    • ServerSocket

      protected ServerSocket(SocketImpl  impl)
      使用用户指定的 SocketImpl 创建服务套接字。
      参数:
      impl - 在 ServerSocket 上使用的 SocketImpl 实例。
      抛出:
      NullPointerException - 如果 impl 是 null
      SecurityException - 如果设置了安全管理器并且其 checkPermission 方法不允许 NetPermission("setSocketImpl")
      自从:
      12
    • ServerSocket

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

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

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

      如果应用程序指定了服务套接字实现工厂,则调用该工厂的 createSocketImpl 方法来创建实际的套接字实现。否则将创建系统默认套接字实现。

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

      参数:
      port - 端口号,或 0 使用自动分配的端口号。
      抛出:
      IOException - 如果打开套接字时发生 I/O 错误。
      SecurityException - 如果安全管理器存在且其 checkListen 方法不允许该操作。
      IllegalArgumentException - 如果端口参数超出有效端口值的指定范围,即介于 0 和 65535 之间(含)。
      参见:
    • ServerSocket

      public ServerSocket(int port, int backlog) throws IOException
      创建一个服务套接字并将其绑定到指定的本地端口号,具有指定的积压。端口号 0 表示端口号是自动分配的,通常来自临时端口范围。然后可以通过调用 getLocalPort 检索此端口号。

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

      如果应用程序指定了服务套接字实现工厂,则调用该工厂的 createSocketImpl 方法来创建实际的套接字实现。否则将创建系统默认套接字实现。

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

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

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

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

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

    • bind

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

      如果地址是 null ,那么系统将选择一个临时端口和一个有效的本地地址来绑定套接字。

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

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

      如果地址是 null ,那么系统将选择一个临时端口和一个有效的本地地址来绑定套接字。

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

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

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

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

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

      返回:
      此套接字绑定到的地址,如果被安全管理器拒绝,则为环回地址,如果套接字未绑定,则为 null
      参见:
    • getLocalPort

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

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

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

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

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

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

      返回:
      一个 SocketAddress 表示这个套接字的本地端点,或者一个 SocketAddress 表示环回地址,如果被安全管理器拒绝,或者 null 如果套接字尚未绑定。
      自从:
      1.4
      参见:
    • accept

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

      此方法在以下情况下是可中断的

      1. 插座是 联系ServerSocketChannel 。在这种情况下,中断接受连接的线程将关闭底层通道并导致此方法抛出 ClosedByInterruptException 并设置中断状态。
      2. 套接字使用系统默认套接字实现和 虚拟线程PREVIEW 正在接受连接。在那种情况下,中断虚拟线程将导致它唤醒并关闭套接字。然后此方法将抛出 SocketException 并设置中断状态。

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

      实现注意事项:
      使用系统默认 SocketImpl 的此类的实例接受具有相同类型的 SocketImpl 的套接字,而不管 客户端套接字实现工厂 是否已设置。
      返回:
      新套接字
      抛出:
      IOException - 如果在等待连接时发生 I/O 错误。
      SecurityException - 如果安全管理器存在且其 checkAccept 方法不允许该操作。
      SocketTimeoutException - 如果先前使用 setSoTimeout 设置了超时并且已达到超时。
      IllegalBlockingModeException - 如果此套接字有关联的通道,则该通道处于非阻塞模式,并且没有准备好接受的连接
      参见:
    • implAccept

      protected final void implAccept(Socket  s) throws IOException
      ServerSocket 的子类使用此方法重写 accept() 以返回自己的套接字子类。因此,FooServerSocket 通常会将新创建的未绑定 FooSocket 传递给此方法。从 implAccept 返回时,FooSocket 将连接到客户端。

      当使用不是新创建和未绑定的套接字调用时,此方法的行为是未指定的。在接受连接时,在调用此方法之前在给定套接字上设置的任何套接字选项可能会或可能不会保留。当此套接字具有一种类型的 SocketImpl 而给定套接字具有完全不同类型的 SocketImpl 时,可能无法接受连接。

      实现注意事项:
      使用系统默认 SocketImpl 的此类的实例可以使用相同类型的 SocketImpl 接受与 Socket 的连接:如果 Socket 使用自定义 SocketImpl 则抛出 IOException 。使用自定义 SocketImpl 的此类的实例无法接受与使用系统默认 SocketImpl 的套接字的连接。
      参数:
      s - 套接字
      抛出:
      IllegalBlockingModeException - 如果这个套接字有一个关联的通道,并且通道处于非阻塞模式
      IOException - 如果在等待连接时发生 I/O 错误,或者如果此套接字无法接受与给定套接字的连接
      自从:
      1.1
    • close

      public void close() throws IOException
      关闭这个套接字。当前在 accept() 中阻塞的任何线程都将抛出 SocketException

      如果此套接字有关联的通道,则该通道也会关闭。

      指定者:
      close 在接口 AutoCloseable
      指定者:
      close 在接口 Closeable
      抛出:
      IOException - 如果在关闭套接字时发生 I/O 错误。
    • getChannel

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

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

      返回:
      与此套接字关联的服务套接字通道,如果此套接字不是为通道创建的,则为 null
      自从:
      1.4
    • isBound

      public boolean isBound()
      返回 ServerSocket 的绑定状态。

      如果在 关闭 之前绑定了套接字,则此方法将在套接字关闭后继续返回 true

      返回:
      如果 ServerSocket 成功绑定到地址,则为 true
      自从:
      1.4
    • isClosed

      public boolean isClosed()
      返回 ServerSocket 的关闭状态。
      返回:
      如果套接字已关闭,则为真
      自从:
      1.4
    • setSoTimeout

      public void setSoTimeout(int timeout) throws SocketException
      使用指定的超时启用/禁用 SO_TIMEOUT ,以毫秒为单位。将此选项设置为正超时值后,为此 ServerSocket 调用 accept() 将仅在这段时间内阻塞。如果超时到期,一个java.net.SocketTimeoutException被引发,尽管 ServerSocket 仍然有效。零超时被解释为无限超时。选项必须在进入阻塞操作之前启用才能生效。
      参数:
      timeout - 指定的超时时间,以毫秒为单位
      抛出:
      SocketException - 如果底层协议有错误,比如TCP错误
      IllegalArgumentException - 如果 timeout 为负
      自从:
      1.1
      参见:
    • getSoTimeout

      public int getSoTimeout() throws IOException
      检索 SO_TIMEOUT 的设置。返回 0 意味着该选项被禁用(即无限超时)。
      返回:
      SO_TIMEOUT
      抛出:
      IOException - 如果发生 I/O 错误
      自从:
      1.1
      参见:
    • setReuseAddress

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

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

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

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

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

      参数:
      on - 是否启用或禁用套接字选项
      抛出:
      SocketException - 如果启用或禁用 SO_REUSEADDR 套接字选项时发生错误,或者套接字已关闭。
      自从:
      1.4
      参见:
    • getReuseAddress

      public boolean getReuseAddress() throws SocketException
      测试 SO_REUSEADDR 是否启用。
      返回:
      boolean 指示是否启用 SO_REUSEADDR
      抛出:
      SocketException - 如果底层协议出现错误,例如 TCP 错误。
      自从:
      1.4
      参见:
    • toString

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

      如果设置了安全管理器,并且此套接字为 bound ,则使用本地地址和 -1 作为参数调用其 checkConnect 方法以查看是否允许该操作。如果不允许该操作,则返回表示 loopback 地址的 InetAddress 作为实现地址。

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

      @Deprecated (since ="17") public static void setSocketFactory(SocketImplFactory  fac) throws IOException
      已弃用。
      直接使用 ServerSocketFactory 和子类 ServerSocket
      此方法在早期的 JDK 版本中提供了一种方法来替换 ServerSocket 的系统范围实现。自 Java 1.4 以来,它已基本过时。如果需要,可以通过扩展 ServerSocket 并使用以 执行 作为参数的 受保护的构造函数 创建 ServerSocket 以使用自定义实现。
      为应用程序设置服务套接字实现工厂。工厂只能指定一次。

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

      null 传递给方法是空操作,除非工厂已经设置。

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

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

      public void setReceiveBufferSize(int size) throws SocketException
      为从此 ServerSocket 接受的套接字设置 SO_RCVBUF 选项的默认建议值。 accepted socket 中实际设置的值必须在accept() 返回socket 后通过调用Socket.getReceiveBufferSize() 来确定。

      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

      public int getReceiveBufferSize() throws SocketException
      获取此 ServerSocketSO_RCVBUF 选项的值,即建议的缓冲区大小,将用于从此 ServerSocket 接受的套接字。

      请注意,在接受的套接字中实际设置的值是通过调用 Socket.getReceiveBufferSize() 确定的。

      返回:
      SocketSO_RCVBUF 选项的值。
      抛出:
      SocketException - 如果底层协议出现错误,例如 TCP 错误。
      自从:
      1.4
      参见:
    • 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
    • setOption

      public <T> ServerSocket  setOption(SocketOption <T> name, T value) throws IOException
      设置套接字选项的值。
      类型参数:
      T - 套接字选项值的类型
      参数:
      name - 套接字选项
      value - 套接字选项的值。 null 的值可能对某些选项有效。
      返回:
      这个 ServerSocket
      抛出:
      UnsupportedOperationException - 如果服务套接字不支持该选项。
      IllegalArgumentException - 如果该值对选项无效。
      IOException - 如果发生 I/O 错误,或者套接字已关闭。
      NullPointerException - 如果名字是 null
      SecurityException - 如果设置了安全管理器并且套接字选项需要安全权限并且调用者没有所需的权限。 StandardSocketOptions 不需要任何安全许可。
      自从:
      9
    • 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,则该集合可能为空。
      自从:
      9