- java.lang.Object
-
- java.net.ServerSocket
-
- All Implemented Interfaces:
-
Closeable
,AutoCloseable
- 已知直接子类:
-
SSLServerSocket
public class ServerSocket extends Object implements Closeable
这个类实现了服务器套接字。 服务器套接字等待通过网络进入的请求。 它根据该请求执行一些操作,然后可能将结果返回给请求者。服务器套接字的实际工作由
SocketImpl
类的实例执行。 应用程序可以更改创建套接字实现的套接字工厂,以配置自己创建适合本地防火墙的套接字。- 从以下版本开始:
- 1.0
- 另请参见:
-
SocketImpl
,setSocketFactory(java.net.SocketImplFactory)
,ServerSocketChannel
-
-
构造方法摘要
构造方法 Constructor 描述 ServerSocket()
创建未绑定的服务器套接字。ServerSocket(int port)
创建绑定到指定端口的服务器套接字。ServerSocket(int port, int backlog)
创建服务器套接字并将其绑定到指定的本地端口号,并指定了积压。ServerSocket(int port, int backlog, InetAddress bindAddr)
创建一个具有指定端口的服务器,侦听backlog和本地IP地址绑定。
-
方法摘要
所有方法 静态方法 接口方法 具体的方法 Modifier and Type 方法 描述 Socket
accept()
侦听要连接到此套接字并接受它。void
bind(SocketAddress endpoint)
将ServerSocket
绑定到特定地址(IP地址和端口号)。void
bind(SocketAddress endpoint, int backlog)
将ServerSocket
绑定到特定地址(IP地址和端口号)。void
close()
关闭此套接字。ServerSocketChannel
getChannel()
返回与此套接字相关联的唯一的ServerSocketChannel
对象(如果有)。InetAddress
getInetAddress()
返回此服务器套接字的本地地址。int
getLocalPort()
返回此套接字正在侦听的端口号。SocketAddress
getLocalSocketAddress()
返回此套接字绑定到的端点的地址。<T> T
getOption(SocketOption<T> name)
返回套接字选项的值。int
getReceiveBufferSize()
boolean
getReuseAddress()
测试是否启用了SO_REUSEADDR
。int
getSoTimeout()
检索SO_TIMEOUT
的设置。 0返回意味着该选项被禁用(即无限超时)。protected 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)
设置为默认建议值SO_RCVBUF
选择从该接受的套接字ServerSocket
。void
setReuseAddress(boolean on)
启用/禁用SO_REUSEADDR
套接字选项。static void
setSocketFactory(SocketImplFactory fac)
设置应用程序的服务器套接字实现工厂。void
setSoTimeout(int timeout)
启用/禁用SO_TIMEOUT
与指定的超时,以毫秒为单位。Set<SocketOption<?>>
supportedOptions()
返回此服务器套接字支持的一组套接字选项。String
toString()
将此套接字的实现地址和实现端口作为String
。
-
-
-
构造方法详细信息
-
ServerSocket
public ServerSocket() throws IOException
创建未绑定的服务器套接字。- 异常
-
IOException
- 打开插槽时出现IO错误。
-
ServerSocket
public ServerSocket(int port) throws IOException
创建绑定到指定端口的服务器套接字。 端口号为0
意味着端口号被自动分配,通常是从短暂的端口范围。 这个端口号可以通过调用getLocalPort
来检索。输入连接指示(连接请求)的最大队列长度设置为
50
。 如果连接指示在队列已满时到达,则连接被拒绝。如果应用程序指定了服务器套接字工厂,则会调用该工厂的
createSocketImpl
方法来创建实际的套接字实现。 否则,将创建一个“普通”套接字。如果有安全管理器,
checkListen
port
参数作为参数调用其checkListen
方法,以确保允许操作。 这可能会导致SecurityException。- 参数
-
port
- 端口号,或0
使用自动分配的端口号。 - 异常
-
IOException
- 如果打开插座时发生I / O错误。 -
SecurityException
- 如果安全管理器存在,并且其checkListen
方法不允许操作。 -
IllegalArgumentException
- 如果端口参数超出了在0到65535之间的有效端口值的指定范围(包括0和65535之间)。 - 另请参见:
-
SocketImpl
,SocketImplFactory.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
- 如果端口参数超出了指定的有效端口值范围(介于0到65535之间)。 - 另请参见:
-
SocketImpl
,SocketImplFactory.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
意味着端口号被自动分配,通常是从短暂的端口范围。 然后可以通过调用getLocalPort
检索该端口号。如果有安全管理器,则该方法调用其
checkListen
方法,其参数为port
,以确保操作是允许的。 这可能会导致SecurityException。backlog
参数是套接字上请求的最大挂起连接数。 其确切语义是实现具体的。 特别地,实现可以施加最大长度,或者可以选择忽略参数altogther。 提供的值应大于0
。 如果小于或等于0
,则将使用实现特定的默认值。- 参数
-
port
- 端口号,或0
使用自动分配的端口号。 -
backlog
- 请求进入连接队列的最大长度。 -
bindAddr
- 服务器将绑定到的本地InetAddress - 异常
-
SecurityException
- 如果存在安全管理员,并且其checkListen
方法不允许操作。 -
IOException
- 如果打开套接字时发生I / O错误。 -
IllegalArgumentException
- 如果端口参数超出了在0到65535之间的有效端口值的指定范围(包括0和65535之间)。 - 从以下版本开始:
- 1.1
- 另请参见:
-
SocketOptions
,SocketImpl
,SecurityManager.checkListen(int)
-
-
方法详细信息
-
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
参数是套接字上请求的最大挂起连接数。 其确切语义是实现具体的。 特别地,实现可以施加最大长度,或者可以选择忽略参数altogther。 提供的价值应大于0
。 如果小于或等于0
,则将使用实现特定的默认值。- 参数
-
endpoint
- 绑定到的IP地址和端口号。 -
backlog
- 请求进入连接队列的最大长度。 - 异常
-
IOException
- 如果绑定操作失败,或者套接字已经绑定。 -
SecurityException
- 如果一个SecurityManager
存在,其checkListen
方法不允许操作。 -
IllegalArgumentException
- 如果端点是此套接字不支持的SocketAddress子类 - 从以下版本开始:
- 1.4
-
getInetAddress
public InetAddress getInetAddress()
返回此服务器套接字的本地地址。如果套接字被绑定在
closed
之前,则该方法将在套接字关闭后继续返回本地地址。如果有一个安全管理器集,它的
checkConnect
方法被调用本地地址和-1
作为参数来查看是否允许该操作。 如果不允许操作,则返回loopback
地址。- 结果
-
该套接字绑定到的地址,如果安全管理器被拒绝的环回地址,或者如果套接字未绑定,
null
。 - 另请参见:
-
SecurityManager.checkConnect(java.lang.String, int)
-
getLocalPort
public int getLocalPort()
返回此套接字正在侦听的端口号。如果套接字被绑定在
closed
之前,则该方法将在套接字关闭后继续返回端口号。- 结果
- 该套接字正在侦听的端口号,如果套接字尚未绑定,则为-1。
-
getLocalSocketAddress
public SocketAddress getLocalSocketAddress()
返回此套接字绑定到的端点的地址。如果套接字被绑定在
closed
之前,则该方法将在套接字关闭后继续返回端点的地址。如果有一个安全管理器集,其
checkConnect
方法将以本地地址和-1
作为参数来调用,以查看是否允许该操作。 如果不允许操作,则SocketAddress
表示loopback
地址的SocketAddress和该套接字所绑定的本地端口。- 结果
-
一个
SocketAddress
表示此套接字的本地端点,或SocketAddress
表示如果安全管理器拒绝的环回地址,或null
如果套接字尚未绑定)。 - 从以下版本开始:
- 1.4
- 另请参见:
-
getInetAddress()
,getLocalPort()
,bind(SocketAddress)
,SecurityManager.checkConnect(java.lang.String, int)
-
accept
public Socket accept() throws IOException
侦听要连接到此套接字并接受它。 该方法将阻塞直到建立连接。将创建一个新的套接字
s
,如果有安全管理器,则使用s.getInetAddress().getHostAddress()
和s.getPort()
作为其参数调用安全管理器的checkAccept
方法,以确保允许操作。 这可能会导致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
-
close
public void close() throws IOException
- Specified by:
-
close
在接口AutoCloseable
- Specified by:
-
close
在接口Closeable
- 异常
-
IOException
- 如果关闭套接字时发生I / O错误。
-
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()
-
getSoTimeout
public int getSoTimeout() throws IOException
检索SO_TIMEOUT
的设置。 0返回意味着该选项被禁用(即无限超时)。- 结果
-
SO_TIMEOUT
的价值 - 异常
-
IOException
- 如果发生I / O错误 - 从以下版本开始:
- 1.1
- 另请参见:
-
setSoTimeout(int)
-
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()
,bind(SocketAddress)
,isBound()
,isClosed()
-
getReuseAddress
public boolean getReuseAddress() throws SocketException
测试是否启用了SO_REUSEADDR
。- 结果
-
一个
boolean
表示是否启用了SO_REUSEADDR
。 - 异常
-
SocketException
- 如果底层协议有错误,如TCP错误。 - 从以下版本开始:
- 1.4
- 另请参见:
-
setReuseAddress(boolean)
-
toString
public String toString()
将此套接字的实现地址和实现端口作为String
。如果有一个安全管理器集,其
checkConnect
方法将以本地地址和-1
作为参数来调用,以查看是否允许该操作。 如果不允许的操作,InetAddress
表示loopback
个地址返回作为实现地址。
-
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()
-
getReceiveBufferSize
public int getReceiveBufferSize() throws SocketException
获取此ServerSocket
的SO_RCVBUF
选项的值,即将用于从该ServerSocket
接受的套接字的建议缓冲区大小。请注意,在接受的套接字中实际设置的值是通过调用
Socket.getReceiveBufferSize()
确定的。- 结果
-
该值为
SO_RCVBUF
的这个Socket
选项。 - 异常
-
SocketException
- 如果底层协议有错误,如TCP错误。 - 从以下版本开始:
- 1.4
- 另请参见:
-
setReceiveBufferSize(int)
-
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
-
-