- 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 方法 描述 Socketaccept()侦听要连接到此套接字并接受它。voidbind(SocketAddress endpoint)将ServerSocket绑定到特定地址(IP地址和端口号)。voidbind(SocketAddress endpoint, int backlog)将ServerSocket绑定到特定地址(IP地址和端口号)。voidclose()关闭此套接字。ServerSocketChannelgetChannel()返回与此套接字相关联的唯一的ServerSocketChannel对象(如果有)。InetAddressgetInetAddress()返回此服务器套接字的本地地址。intgetLocalPort()返回此套接字正在侦听的端口号。SocketAddressgetLocalSocketAddress()返回此套接字绑定到的端点的地址。<T> TgetOption(SocketOption<T> name)返回套接字选项的值。intgetReceiveBufferSize()booleangetReuseAddress()测试是否启用了SO_REUSEADDR。intgetSoTimeout()检索SO_TIMEOUT的设置。 0返回意味着该选项被禁用(即无限超时)。protected 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)设置为默认建议值SO_RCVBUF选择从该接受的套接字ServerSocket。voidsetReuseAddress(boolean on)启用/禁用SO_REUSEADDR套接字选项。static voidsetSocketFactory(SocketImplFactory fac)设置应用程序的服务器套接字实现工厂。voidsetSoTimeout(int timeout)启用/禁用SO_TIMEOUT与指定的超时,以毫秒为单位。Set<SocketOption<?>>supportedOptions()返回此服务器套接字支持的一组套接字选项。StringtoString()将此套接字的实现地址和实现端口作为String。
-
-
-
构造方法详细信息
-
ServerSocket
public ServerSocket() throws IOException创建未绑定的服务器套接字。- 异常
-
IOException- 打开插槽时出现IO错误。
-
ServerSocket
public ServerSocket(int port) throws IOException创建绑定到指定端口的服务器套接字。 端口号为0意味着端口号被自动分配,通常是从短暂的端口范围。 这个端口号可以通过调用getLocalPort来检索。输入连接指示(连接请求)的最大队列长度设置为
50。 如果连接指示在队列已满时到达,则连接被拒绝。如果应用程序指定了服务器套接字工厂,则会调用该工厂的
createSocketImpl方法来创建实际的套接字实现。 否则,将创建一个“普通”套接字。如果有安全管理器,
checkListenport参数作为参数调用其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
-
-