- java.lang.Object
-
- java.net.ServerSocket
-
- 实现的所有接口
-
Closeable
,AutoCloseable
- 已知直接子类:
-
SSLServerSocket
public class ServerSocket extends Object implements Closeable
该类实现服务器套接字。 服务器套接字等待通过网络进入的请求。 它根据该请求执行某些操作,然后可能将结果返回给请求者。服务器套接字的实际工作由
SocketImpl
类的实例执行。 应用程序可以更改创建套接字实现的套接字工厂,以配置自身以创建适合本地防火墙的套接字。- 从以下版本开始:
- 1.0
- 另请参见:
-
SocketImpl
,setSocketFactory(java.net.SocketImplFactory)
,ServerSocketChannel
-
-
构造方法摘要
构造方法 构造器 描述 ServerSocket()
创建未绑定的服务器套接字。ServerSocket(int port)
创建绑定到指定端口的服务器套接字。ServerSocket(int port, int backlog)
创建服务器套接字并使用指定的待办事项将其绑定到指定的本地端口号。ServerSocket(int port, int backlog, InetAddress bindAddr)
创建具有指定端口的服务器,监听backlog和要绑定的本地IP地址。
-
方法摘要
所有方法 静态方法 实例方法 具体的方法 变量和类型 方法 描述 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
方法以创建实际的套接字实现。 否则会创建一个“普通”套接字。如果存在安全管理器,则使用
port
参数作为其参数调用其checkListen
方法,以确保允许操作。 这可能会导致SecurityException。- 参数
-
port
- 端口号,或0
以使用自动分配的端口号。 - 异常
-
IOException
- 如果在打开套接字时发生I / O错误。 -
SecurityException
- 如果存在安全管理器且其checkListen
方法不允许该操作。 -
IllegalArgumentException
- 如果port参数超出指定的有效端口值范围,则介于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
- 如果port参数超出指定的有效端口值范围,则介于0和65535之间(包括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和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
- 另请参见:
-
SocketOptions
,SocketImpl
,SecurityManager.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()
- 结果
- 此套接字正在侦听的端口号,如果套接字尚未绑定,则为-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
-
close
public void close() throws IOException
- Specified by:
-
close
in interfaceAutoCloseable
- Specified by:
-
close
in interfaceCloseable
- 异常
-
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
时,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
。- 结果
-
a
boolean
指示是否已启用SO_REUSEADDR
。 - 异常
-
SocketException
- 如果底层协议中存在错误,例如TCP错误。 - 从以下版本开始:
- 1.4
- 另请参见:
-
setReuseAddress(boolean)
-
toString
public String toString()
以String
返回此套接字的实现地址和实现端口。如果存在安全管理器集,则使用本地地址和
-1
作为其参数调用其checkConnect
方法,以查看是否允许该操作。 如果不允许的操作,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()
确定在接受的套接字中实际设置的值。- 结果
-
此
Socket
的SO_RCVBUF
选项的值。 - 异常
-
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,则此set可能为空。
- 从以下版本开始:
- 9
-
-