- 所有已实现的接口:
Closeable,AutoCloseable
- 已知子类:
SSLServerSocket
服务套接字的实际工作由 SocketImpl 类的实例执行。
ServerSocket 类定义了设置和获取多个套接字选项的便捷方法。此类还定义了 setOption 和 getOption 方法来设置和查询套接字选项。 ServerSocket 支持以下选项:
还可以支持其他(特定于实现的)选项。
选项名称 Description SO_RCVBUF套接字接收缓冲区的大小 SO_REUSEADDR重复使用地址
- 自从:
- 1.0
- 参见:
-
构造方法总结
构造方法修饰符构造方法描述创建一个未绑定的服务套接字。ServerSocket(int port) 创建绑定到指定端口的服务套接字。ServerSocket(int port, int backlog) 创建一个服务套接字并将其绑定到指定的本地端口号,具有指定的积压。ServerSocket(int port, int backlog, InetAddress bindAddr) 创建具有指定端口、监听积压和要绑定的本地 IP 地址的服务。protectedServerSocket(SocketImpl impl) 使用用户指定的SocketImpl创建服务套接字。 -
方法总结
修饰符和类型方法描述accept()监听与此套接字建立的连接并接受它。voidbind(SocketAddress endpoint) 将ServerSocket绑定到特定地址(IP 地址和端口号)。voidbind(SocketAddress endpoint, int backlog) 将ServerSocket绑定到特定地址(IP 地址和端口号)。voidclose()关闭这个套接字。返回与此套接字关联的唯一ServerSocketChannel对象(如果有)。返回此服务套接字的本地地址。int返回此套接字正在监听的端口号。返回此套接字绑定到的端点的地址。<T> TgetOption(SocketOption<T> name) 返回套接字选项的值。intboolean测试SO_REUSEADDR是否启用。int检索SO_TIMEOUT的设置。返回 0 意味着该选项被禁用(即无限超时)。protected final voidimplAccept(Socket s) ServerSocket 的子类使用此方法重写 accept() 以返回自己的套接字子类。booleanisBound()返回 ServerSocket 的绑定状态。booleanisClosed()返回 ServerSocket 的关闭状态。<T> ServerSocketsetOption(SocketOption<T> name, T value) 设置套接字选项的值。voidsetPerformancePreferences(int connectionTime, int latency, int bandwidth) 为此 ServerSocket 设置性能首选项。voidsetReceiveBufferSize(int size) 为从此ServerSocket接受的套接字设置SO_RCVBUF选项的默认建议值。voidsetReuseAddress(boolean on) 启用/禁用SO_REUSEADDR套接字选项。static void已弃用。voidsetSoTimeout(int timeout) 使用指定的超时启用/禁用SO_TIMEOUT,以毫秒为单位。Set<SocketOption<?>>返回此服务套接字支持的一组套接字选项。toString()返回此套接字的实现地址和实现端口作为String。
-
构造方法详细信息
-
ServerSocket
使用用户指定的SocketImpl创建服务套接字。- 参数:
impl- 在 ServerSocket 上使用的 SocketImpl 实例。- 抛出:
NullPointerException- 如果 impl 是null。SecurityException- 如果设置了安全管理器并且其checkPermission方法不允许NetPermission("setSocketImpl")。- 自从:
- 12
-
ServerSocket
创建一个未绑定的服务套接字。- 抛出:
IOException- 打开套接字时出现 IO 错误。
-
ServerSocket
创建绑定到指定端口的服务套接字。端口号0表示端口号是自动分配的,通常来自临时端口范围。然后可以通过调用getLocalPort检索此端口号。传入连接指示(连接请求)的最大队列长度设置为
50。如果连接指示在队列已满时到达,则拒绝连接。如果应用程序指定了服务套接字实现工厂,则调用该工厂的
createSocketImpl方法来创建实际的套接字实现。否则将创建系统默认套接字实现。如果有安全管理器,则调用其
checkListen方法,并将port参数作为其参数,以确保允许操作。这可能会导致 SecurityException。- 参数:
port- 端口号,或0使用自动分配的端口号。- 抛出:
IOException- 如果打开套接字时发生 I/O 错误。SecurityException- 如果安全管理器存在且其checkListen方法不允许该操作。IllegalArgumentException- 如果端口参数超出有效端口值的指定范围,即介于 0 和 65535 之间(含)。- 参见:
-
ServerSocket
创建一个服务套接字并将其绑定到指定的本地端口号,具有指定的积压。端口号0表示端口号是自动分配的,通常来自临时端口范围。然后可以通过调用getLocalPort检索此端口号。传入连接指示(连接请求)的最大队列长度设置为
backlog参数。如果连接指示在队列已满时到达,则拒绝连接。如果应用程序指定了服务套接字实现工厂,则调用该工厂的
createSocketImpl方法来创建实际的套接字实现。否则将创建系统默认套接字实现。如果有安全管理器,则调用其
checkListen方法,并将port参数作为其参数,以确保允许操作。这可能会导致 SecurityException。backlog参数是套接字上请求的最大挂起连接数。它的确切语义是特定于实现的。特别是,一个实现可能会强加一个最大长度,或者可能会选择完全忽略该参数。提供的值应大于0。如果它小于或等于0,则将使用特定于实现的默认值。- 参数:
port- 端口号,或0使用自动分配的端口号。backlog- 请求传入连接队列的最大长度。- 抛出:
IOException- 如果打开套接字时发生 I/O 错误。SecurityException- 如果安全管理器存在且其checkListen方法不允许该操作。IllegalArgumentException- 如果端口参数超出有效端口值的指定范围,即介于 0 和 65535 之间(含)。- 参见:
-
ServerSocket
创建具有指定端口、监听积压和要绑定的本地 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
将ServerSocket绑定到特定地址(IP 地址和端口号)。如果地址是
null,那么系统将选择一个临时端口和一个有效的本地地址来绑定套接字。- 参数:
endpoint- 要绑定的 IP 地址和端口号。- 抛出:
IOException- 如果绑定操作失败,或者套接字已经绑定。SecurityException- 如果存在SecurityManager并且其checkListen方法不允许该操作。IllegalArgumentException- 如果端点是此套接字不支持的 SocketAddress 子类- 自从:
- 1.4
-
bind
将ServerSocket绑定到特定地址(IP 地址和端口号)。如果地址是
null,那么系统将选择一个临时端口和一个有效的本地地址来绑定套接字。backlog参数是套接字上请求的最大挂起连接数。它的确切语义是特定于实现的。特别是,一个实现可能会强加一个最大长度,或者可能会选择完全忽略该参数。提供的值应大于0。如果它小于或等于0,则将使用特定于实现的默认值。- 参数:
endpoint- 要绑定的 IP 地址和端口号。backlog- 请求传入连接队列的最大长度。- 抛出:
IOException- 如果绑定操作失败,或者套接字已经绑定。SecurityException- 如果存在SecurityManager并且其checkListen方法不允许该操作。IllegalArgumentException- 如果端点是此套接字不支持的 SocketAddress 子类- 自从:
- 1.4
-
getInetAddress
返回此服务套接字的本地地址。如果套接字在
closed之前被绑定,则此方法将在套接字关闭后继续返回本地地址。如果设置了安全管理器,则以本地地址和
-1作为参数调用其checkConnect方法,以查看是否允许该操作。如果不允许操作,则返回loopback地址。- 返回:
-
此套接字绑定到的地址,如果被安全管理器拒绝,则为环回地址,如果套接字未绑定,则为
null。 - 参见:
-
getLocalPort
public int getLocalPort()返回此套接字正在监听的端口号。如果在
closed之前绑定了套接字,则此方法将在套接字关闭后继续返回端口号。- 返回:
- 此套接字正在监听的端口号,如果套接字尚未绑定,则为 -1。
-
getLocalSocketAddress
返回此套接字绑定到的端点的地址。如果套接字在
closed之前被绑定,则此方法将在套接字关闭后继续返回端点的地址。如果设置了安全管理器,则以本地地址和
-1作为参数调用其checkConnect方法,以查看是否允许该操作。如果不允许该操作,则返回表示loopback地址和套接字绑定到的本地端口的SocketAddress。- 返回:
-
一个
SocketAddress表示这个套接字的本地端点,或者一个SocketAddress表示环回地址,如果被安全管理器拒绝,或者null如果套接字尚未绑定。 - 自从:
- 1.4
- 参见:
-
accept
监听与此套接字建立的连接并接受它。该方法会阻塞,直到建立连接。此方法在以下情况下是可中断的:
- 插座是 联系 和
ServerSocketChannel。在这种情况下,中断接受连接的线程将关闭底层通道并导致此方法抛出ClosedByInterruptException并设置中断状态。 - 套接字使用系统默认套接字实现和 虚拟线程PREVIEW 正在接受连接。在那种情况下,中断虚拟线程将导致它唤醒并关闭套接字。然后此方法将抛出
SocketException并设置中断状态。
创建一个新的 Socket
s,如果有安全管理器,则调用安全管理器的checkAccept方法,并将s.getInetAddress().getHostAddress()和s.getPort()作为其参数,以确保允许操作。这可能会导致 SecurityException。- 实现注意事项:
-
使用系统默认
SocketImpl的此类的实例接受具有相同类型的SocketImpl的套接字,而不管 客户端套接字实现工厂 是否已设置。 - 返回:
- 新套接字
- 抛出:
IOException- 如果在等待连接时发生 I/O 错误。SecurityException- 如果安全管理器存在且其checkAccept方法不允许该操作。SocketTimeoutException- 如果先前使用 setSoTimeout 设置了超时并且已达到超时。IllegalBlockingModeException- 如果此套接字有关联的通道,则该通道处于非阻塞模式,并且没有准备好接受的连接- 参见:
- 插座是 联系 和
-
implAccept
ServerSocket 的子类使用此方法重写 accept() 以返回自己的套接字子类。因此,FooServerSocket 通常会将新创建的未绑定 FooSocket 传递给此方法。从 implAccept 返回时,FooSocket 将连接到客户端。当使用不是新创建和未绑定的套接字调用时,此方法的行为是未指定的。在接受连接时,在调用此方法之前在给定套接字上设置的任何套接字选项可能会或可能不会保留。当此套接字具有一种类型的
SocketImpl而给定套接字具有完全不同类型的SocketImpl时,可能无法接受连接。- 实现注意事项:
-
使用系统默认
SocketImpl的此类的实例可以使用相同类型的SocketImpl接受与 Socket 的连接:如果 Socket 使用自定义SocketImpl则抛出IOException。使用自定义SocketImpl的此类的实例无法接受与使用系统默认SocketImpl的套接字的连接。 - 参数:
s- 套接字- 抛出:
IllegalBlockingModeException- 如果这个套接字有一个关联的通道,并且通道处于非阻塞模式IOException- 如果在等待连接时发生 I/O 错误,或者如果此套接字无法接受与给定套接字的连接- 自从:
- 1.1
-
close
- 指定者:
close在接口AutoCloseable中- 指定者:
close在接口Closeable中- 抛出:
IOException- 如果在关闭套接字时发生 I/O 错误。
-
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
使用指定的超时启用/禁用SO_TIMEOUT,以毫秒为单位。将此选项设置为正超时值后,为此 ServerSocket 调用 accept() 将仅在这段时间内阻塞。如果超时到期,一个java.net.SocketTimeoutException被引发,尽管 ServerSocket 仍然有效。零超时被解释为无限超时。选项必须在进入阻塞操作之前启用才能生效。- 参数:
timeout- 指定的超时时间,以毫秒为单位- 抛出:
SocketException- 如果底层协议有错误,比如TCP错误IllegalArgumentException- 如果timeout为负- 自从:
- 1.1
- 参见:
-
getSoTimeout
检索SO_TIMEOUT的设置。返回 0 意味着该选项被禁用(即无限超时)。- 返回:
SO_TIMEOUT值- 抛出:
IOException- 如果发生 I/O 错误- 自从:
- 1.1
- 参见:
-
setReuseAddress
启用/禁用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
测试SO_REUSEADDR是否启用。- 返回:
boolean指示是否启用SO_REUSEADDR。- 抛出:
SocketException- 如果底层协议出现错误,例如 TCP 错误。- 自从:
- 1.4
- 参见:
-
toString
-
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
为从此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
获取此ServerSocket的SO_RCVBUF选项的值,即建议的缓冲区大小,将用于从此ServerSocket接受的套接字。请注意,在接受的套接字中实际设置的值是通过调用
Socket.getReceiveBufferSize()确定的。- 返回:
-
此
Socket的SO_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
设置套接字选项的值。- 类型参数:
T- 套接字选项值的类型- 参数:
name- 套接字选项value- 套接字选项的值。null的值可能对某些选项有效。- 返回:
- 这个 ServerSocket
- 抛出:
UnsupportedOperationException- 如果服务套接字不支持该选项。IllegalArgumentException- 如果该值对选项无效。IOException- 如果发生 I/O 错误,或者套接字已关闭。NullPointerException- 如果名字是nullSecurityException- 如果设置了安全管理器并且套接字选项需要安全权限并且调用者没有所需的权限。StandardSocketOptions不需要任何安全许可。- 自从:
- 9
-
getOption
返回套接字选项的值。- 类型参数:
T- 套接字选项值的类型- 参数:
name- 套接字选项- 返回:
- 套接字选项的值。
- 抛出:
UnsupportedOperationException- 如果服务套接字不支持该选项。IOException- 如果发生 I/O 错误,或者套接字已关闭。NullPointerException- 如果名字是nullSecurityException- 如果设置了安全管理器并且套接字选项需要安全权限并且调用者没有所需的权限。StandardSocketOptions不需要任何安全许可。- 自从:
- 9
-
supportedOptions
返回此服务套接字支持的一组套接字选项。即使套接字已关闭,此方法仍将继续返回选项集。- 返回:
- 此套接字支持的一组套接字选项。如果无法创建套接字的 SocketImpl,则该集合可能为空。
- 自从:
- 9
-
ServerSocketFactory和子类ServerSocket。