- 所有已实现的接口:
-
Closeable
,AutoCloseable
- 直接已知的子类:
-
SSLServerSocket
服务器套接字的实际工作由SocketImpl
类的实例执行。
ServerSocket
类定义了一些方便的方法来设置和获取几个套接字选项。该类还定义了setOption
和getOption
方法来设置和查询套接字选项。一个ServerSocket
支持以下选项:
还可能支持其他(特定于实现的)选项。
选项名称 描述 SO_RCVBUF
套接字接收缓冲区的大小 SO_REUSEADDR
重用地址
- 自版本:
- 1.0
- 参见:
-
Constructor Summary
ConstructorsModifierConstructorDescription创建一个未绑定的服务器套接字。ServerSocket
(int port) 创建一个绑定到指定端口的服务器套接字。ServerSocket
(int port, int backlog) 创建一个服务器套接字,并将其绑定到指定的本地端口号,带有指定的积压量。ServerSocket
(int port, int backlog, InetAddress bindAddr) 创建一个具有指定端口、监听积压和要绑定到的本地IP地址的服务器。protected
ServerSocket
(SocketImpl impl) 创建一个具有用户指定的SocketImpl
的服务器套接字。 -
Method Summary
Modifier and TypeMethodDescriptionaccept()
监听要连接到此套接字的连接并接受它。void
bind
(SocketAddress endpoint) 将ServerSocket
绑定到特定地址(IP地址和端口号)。void
bind
(SocketAddress endpoint, int backlog) 将ServerSocket
绑定到特定地址(IP地址和端口号)。void
close()
关闭此套接字。返回与此套接字关联的唯一ServerSocketChannel
对象,如果有的话。返回此服务器套接字的本地地址。int
返回此套接字正在侦听的端口号。返回此套接字绑定到的端点的地址。<T> T
getOption
(SocketOption<T> name) 返回套接字选项的值。int
boolean
测试是否启用了SO_REUSEADDR
。int
检索SO_TIMEOUT
的设置。0表示该选项已禁用(即,超时为无限)。protected final void
implAccept
(Socket s) ServerSocket的子类使用此方法覆盖accept()以返回其自己的套接字子类。boolean
isBound()
返回ServerSocket的绑定状态。boolean
isClosed()
返回ServerSocket的关闭状态。<T> ServerSocket
setOption
(SocketOption<T> name, T value) 设置套接字选项的值。void
setPerformancePreferences
(int connectionTime, int latency, int bandwidth) 为此ServerSocket设置性能首选项。void
setReceiveBufferSize
(int size) 为从此ServerSocket
接受的套接字设置SO_RCVBUF
选项的默认建议值。void
setReuseAddress
(boolean on) 启用/禁用SO_REUSEADDR
套接字选项。static void
已弃用。void
setSoTimeout
(int timeout) 启用/禁用具有指定超时的SO_TIMEOUT
,单位为毫秒。Set
<SocketOption<?>> 返回此服务器套接字支持的套接字选项集。toString()
将此套接字的实现地址和实现端口作为String
返回。
-
Constructor Details
-
ServerSocket
创建一个具有用户指定的SocketImpl
的服务器套接字。- 参数:
-
impl
- 用于ServerSocket的SocketImpl的实例。 - 抛出:
-
NullPointerException
- 如果impl为null
。 -
SecurityException
- 如果设置了安全管理器并且其checkPermission
方法不允许NetPermission("setSocketImpl")
。 - 自版本:
- 12
-
ServerSocket
创建一个未绑定的服务器套接字。- 抛出:
-
IOException
- 打开套接字时发生IO错误。
-
ServerSocket
创建一个绑定到指定端口的服务器套接字。端口号为0
表示端口号是自动分配的,通常是从临时端口范围分配的。然后可以通过调用getLocalPort
来检索此端口号。传入连接指示(连接请求)的最大队列长度设置为
50
。如果队列已满并且有连接指示到达,则拒绝连接。如果应用程序指定了服务器套接字实现工厂,则将调用该工厂的
createSocketImpl
方法来创建实际的套接字实现。否则将创建系统默认的套接字实现。如果存在安全管理器,则将使用
port
参数调用其checkListen
方法以确保允许该操作。这可能导致SecurityException。- 参数:
-
port
- 端口号,或0
以使用自动分配的端口号。 - 抛出:
-
IOException
- 打开套接字时发生I/O错误。 -
SecurityException
- 如果存在安全管理器并且其checkListen
方法不允许该操作。 -
IllegalArgumentException
- 如果端口参数超出有效端口值范围(包括0到65535之间的值)。 - 参见:
-
ServerSocket
创建一个服务器套接字,并将其绑定到指定的本地端口号,带有指定的积压量。端口号为0
表示端口号是自动分配的,通常是从临时端口范围分配的。然后可以通过调用getLocalPort
来检索此端口号。传入连接指示(连接请求)的最大队列长度设置为
backlog
参数。如果队列已满并且有连接指示到达,则拒绝连接。如果应用程序指定了服务器套接字实现工厂,则将调用该工厂的
createSocketImpl
方法来创建实际的套接字实现。否则将创建系统默认的套接字实现。如果存在安全管理器,则将使用
port
参数调用其checkListen
方法以确保允许该操作。这可能导致SecurityException。backlog
参数是套接字上挂起连接的请求的最大数量。其确切语义是特定于实现的。特别是,实现可能施加最大长度,或者选择完全忽略该参数。提供的值应大于0
。如果小于或等于0
,则将使用特定于实现的默认值。- 参数:
-
port
- 端口号,或0
以使用自动分配的端口号。 -
backlog
- 请求的最大连接队列长度。 - 抛出:
-
IOException
- 打开套接字时发生I/O错误。 -
SecurityException
- 如果存在安全管理器并且其checkListen
方法不允许该操作。 -
IllegalArgumentException
- 如果端口参数超出有效端口值范围(包括0到65535之间的值)。 - 参见:
-
ServerSocket
创建具有指定端口、监听队列和本地IP地址绑定的服务器。参数bindAddr可用于多宿主主机上的ServerSocket,该ServerSocket仅接受对其地址之一的连接请求。如果bindAddr为null,则默认接受所有本地地址上的连接请求。端口必须在0到65535之间(包括边界值)。端口号为0
意味着端口号将自动分配,通常从短暂端口范围中分配。然后可以通过调用getLocalPort
来检索此端口号。如果存在安全管理器,则此方法将使用
port
参数调用其checkListen
方法,以确保允许该操作。这可能导致SecurityException。参数backlog
是套接字上请求的挂起连接的最大数量。其确切语义是特定于实现的。特别是,实现可能施加最大长度,或者选择完全忽略该参数。提供的值应大于0
。如果小于或等于0
,则将使用特定于实现的默认值。- 参数:
-
port
- 端口号,或0
以使用自动分配的端口号。 -
backlog
- 请求的传入连接队列的最大长度。 -
bindAddr
- 服务器将绑定到的本地InetAddress - 抛出:
-
SecurityException
- 如果存在安全管理器且其checkListen
方法不允许该操作。 -
IOException
- 如果打开套接字时发生I/O错误。 -
IllegalArgumentException
- 如果端口参数超出有效端口值范围,即0到65535(包括)之间。 - 自版本:
- 1.1
- 参见:
-
-
Method Details
-
bind
将ServerSocket
绑定到特定地址(IP地址和端口号)。如果地址为
null
,则系统将选择一个短暂端口和一个有效的本地地址来绑定套接字。- 参数:
-
endpoint
- 要绑定到的IP地址和端口号。 - 抛出:
-
IOException
- 如果绑定操作失败,或者套接字已经绑定。 -
SecurityException
- 如果存在SecurityManager
并且其checkListen
方法不允许该操作。 -
IllegalArgumentException
- 如果endpoint是此套接字不支持的SocketAddress子类 - 自版本:
- 1.4
-
bind
将ServerSocket
绑定到特定地址(IP地址和端口号)。如果地址为
null
,则系统将选择一个短暂端口和一个有效的本地地址来绑定套接字。backlog
参数是套接字上请求的挂起连接的最大数量。其确切语义是特定于实现的。特别是,实现可能施加最大长度,或者选择完全忽略该参数。提供的值应大于0
。如果小于或等于0
,则将使用特定于实现的默认值。- 参数:
-
endpoint
- 要绑定到的IP地址和端口号。 -
backlog
- 请求的传入连接队列的最大长度。 - 抛出:
-
IOException
- 如果绑定操作失败,或者套接字已经绑定。 -
SecurityException
- 如果存在SecurityManager
并且其checkListen
方法不允许该操作。 -
IllegalArgumentException
- 如果endpoint是此套接字不支持的SocketAddress子类 - 自版本:
- 1.4
-
getInetAddress
返回此服务器套接字的本地地址。如果套接字在关闭之前已绑定,则此方法在套接字关闭后仍将继续返回本地地址。
如果设置了安全管理器,则将使用其
checkConnect
方法,参数为本地地址和-1
,来检查是否允许该操作。如果不允许该操作,则返回loopback
地址。- 返回:
-
绑定到此套接字的地址,如果安全管理器拒绝,则返回回环地址,如果套接字未绑定,则返回
null
。 - 参见:
-
getLocalPort
public int getLocalPort()返回此套接字正在侦听的端口号。如果套接字在关闭之前已绑定,则此方法在套接字关闭后仍将继续返回端口号。
- 返回:
- 此套接字正在侦听的端口号,如果套接字尚未绑定,则返回-1。
-
getLocalSocketAddress
返回此套接字绑定到的端点的地址。如果套接字在关闭之前已绑定,则此方法在套接字关闭后仍将继续返回端点的地址。
如果设置了安全管理器,则将使用其
checkConnect
方法,参数为本地地址和-1
,来检查是否允许该操作。如果不允许该操作,则返回表示套接字绑定到的本地端口的SocketAddress
。- 返回:
-
表示此套接字本地端点的
SocketAddress
,如果安全管理器拒绝,则返回表示回环地址的SocketAddress
,如果套接字尚未绑定,则返回null
。 - 自版本:
- 1.4
- 参见:
-
accept
监听连接并接受连接。该方法将阻塞,直到建立连接。在以下情况下,此方法是可中断的:
- 套接字与关联的
ServerSocketChannel
。在这种情况下,中断接受连接的线程将关闭底层通道,并导致此方法抛出带有中断状态设置的ClosedByInterruptException
。 - 套接字使用系统默认的套接字实现,并且虚拟线程正在接受连接。在这种情况下,中断虚拟线程将导致其唤醒并关闭套接字。然后此方法将抛出带有中断状态设置的
SocketException
。
创建一个新的Socket
s
,如果存在安全管理器,则将调用安全管理器的checkAccept
方法,参数为s.getInetAddress().getHostAddress()
和s.getPort()
,以确保允许该操作。这可能导致SecurityException。- 实现注意:
-
使用系统默认
SocketImpl
的此类的实例接受具有相同类型SocketImpl
的套接字,而不管是否已设置客户端套接字实现工厂。 - 返回:
- 新的Socket
- 抛出:
-
IOException
- 等待连接时发生I/O错误。 -
SecurityException
- 如果存在安全管理器且其checkAccept
方法不允许该操作。 -
SocketTimeoutException
- 如果先前使用setSoTimeout设置了超时,并且已达到超时。 -
IllegalBlockingModeException
- 如果此套接字具有关联通道,通道处于非阻塞模式,并且没有准备好接受的连接 - 参见:
- 套接字与关联的
-
implAccept
ServerSocket的子类使用此方法来重写accept()以返回它们自己的socket子类。因此,FooServerSocket通常会将此方法交给一个新创建的、未绑定的FooSocket。在implAccept返回时,FooSocket将连接到客户端。当使用不是新创建且未绑定的socket调用此方法时,此方法的行为是未指定的。在调用此方法之前设置在给定socket上的任何socket选项可能会在接受连接时保留或不保留。当此socket具有一种SocketImpl类型而给定socket具有完全不同类型的SocketImpl类型时,可能无法接受连接。
- 实现注意事项:
- 使用系统默认SocketImpl的此类的实例可以接受具有相同类型的SocketImpl的Socket的连接:如果Socket使用自定义SocketImpl,则会抛出IOException。使用自定义SocketImpl的此类的实例无法接受具有系统默认SocketImpl的Socket的连接。
- 参数:
- s - Socket
- 抛出:
- IllegalBlockingModeException - 如果此socket具有关联的通道,并且通道处于非阻塞模式
- IOException - 如果等待连接时发生I/O错误,或者此socket无法与给定socket接受连接
- 自从:
- 1.1
-
close
关闭此socket。当前在accept()中阻塞的任何线程将抛出SocketException。如果此socket有关联的通道,则通道也将被关闭。
- 指定者:
- AutoCloseable接口中的close方法
- 指定者:
- Closeable接口中的close方法
- 抛出:
- IOException - 在关闭socket时发生I/O错误时
-
getChannel
返回与此socket关联的唯一ServerSocketChannel对象(如果有)。如果服务器套接字具有通道,则仅当通道本身是通过ServerSocketChannel.open方法创建的时,服务器套接字才会有一个通道。
- 返回:
- 与此socket关联的服务器套接字通道,如果此socket不是为通道创建的,则返回null
- 自从:
- 1.4
-
isBound
public boolean isBound()返回ServerSocket的绑定状态。如果在关闭之前绑定了socket,则在关闭socket后此方法将继续返回true。
- 返回:
- 如果ServerSocket成功绑定到地址,则返回true
- 自从:
- 1.4
-
isClosed
public boolean isClosed()返回ServerSocket的关闭状态。- 返回:
- 如果socket已关闭,则返回true
- 自从:
- 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。- 返回:
- 一个布尔值,指示SO_REUSEADDR是否已启用。
- 抛出:
- SocketException - 如果底层协议中存在错误,例如TCP错误。
- 自从:
- 1.4
- 参见:
-
toString
以String形式返回此socket的实现地址和实现端口。如果设置了安全管理器,并且此socket已绑定,则将调用其checkConnect方法,参数为本地地址和-1,以查看是否允许操作。如果不允许操作,则返回表示回环地址的InetAddress作为实现地址。
- 覆盖:
- Object类中的toString方法
- 返回:
- 此socket的字符串表示形式。
-
setSocketFactory
@Deprecated(since="17") public static void setSocketFactory(SocketImplFactory fac) throws IOException Deprecated.Use aServerSocketFactory
and subclassServerSocket
directly.
This method provided a way in early JDK releases to replace the system wide implementation ofServerSocket
. It has been mostly obsolete since Java 1.4. If required, aServerSocket
can be created to use a custom implementation by extendingServerSocket
and using the protected constructor that takes an implementation as a parameter.设置应用程序的服务器套接字实现工厂。工厂只能指定一次。当应用程序创建新的服务器套接字时,将调用套接字实现工厂的createSocketImpl方法来创建实际的套接字实现。
将null传递给该方法是一个空操作,除非已经设置了工厂。
如果存在安全管理器,此方法首先调用安全管理器的checkSetFactory方法以确保允许操作。这可能导致SecurityException。
- 参数:
- fac - 所需的工厂
- 抛出:
- IOException - 设置套接字工厂时发生I/O错误
- SocketException - 如果工厂已经定义
- SecurityException - 如果存在安全管理器且其checkSetFactory方法不允许操作
- 参见:
-
setReceiveBufferSize
设置ServerSocket
接受的套接字的SO_RCVBUF
选项的默认建议值。实际设置在接受套接字中的值必须通过在套接字被accept()
返回后调用Socket.getReceiveBufferSize()
来确定。SO_RCVBUF
的值用于设置内部套接字接收缓冲区的大小,并设置广告给远程对等方的TCP接收窗口的大小。可以随后更改该值,通过调用
Socket.setReceiveBufferSize(int)
。但是,如果应用程序希望允许大于RFC1323定义的64K字节的接收窗口,则必须在将ServerSocket
绑定到本地地址之前在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
- 表达短连接时间的整数 -
latency
- 表达低延迟的整数 -
bandwidth
- 表达高带宽的整数 - 自从:
- 1.5
-
setOption
设置套接字选项的值。- 类型参数:
-
T
- 套接字选项值的类型 - 参数:
-
name
- 套接字选项 -
value
- 套接字选项的值。对于某些选项,null
值可能有效。 - 返回:
-
此
ServerSocket
- 抛出:
-
UnsupportedOperationException
- 如果服务器套接字不支持该选项。 -
IllegalArgumentException
- 如果值对于该选项无效。 -
IOException
- 如果发生I/O错误,或者套接字已关闭。 -
NullPointerException
- 如果name为null
-
SecurityException
- 如果设置了安全管理器,并且套接字选项需要安全权限,调用者没有所需权限。StandardSocketOptions
不需要任何安全权限。 - 自从:
- 9
-
getOption
返回套接字选项的值。- 类型参数:
-
T
- 套接字选项值的类型 - 参数:
-
name
- 套接字选项 - 返回:
- 套接字选项的值。
- 抛出:
-
UnsupportedOperationException
- 如果服务器套接字不支持该选项。 -
IOException
- 如果发生I/O错误,或者套接字已关闭。 -
NullPointerException
- 如果name为null
-
SecurityException
- 如果设置了安全管理器,并且套接字选项需要安全权限,调用者没有所需权限。StandardSocketOptions
不需要任何安全权限。 - 自从:
- 9
-
supportedOptions
返回此服务器套接字支持的套接字选项集。即使套接字已关闭,此方法仍将继续返回选项集。- 返回:
-
此套接字支持的套接字选项集。如果套接字的
SocketImpl
无法创建,则此集合可能为空。 - 自从:
- 9
-
ServerSocketFactory
并直接子类化ServerSocket
。