public class ServerSocket extends Object implements Closeable
服务器套接字的实际工作由SocketImpl
类的实例执行。 应用程序可以更改创建套接字实现的套接字工厂,以配置自己创建适合本地防火墙的套接字。
SocketImpl
, setSocketFactory(java.net.SocketImplFactory)
, ServerSocketChannel
Constructor and Description |
---|
ServerSocket()
创建未绑定的服务器套接字。
|
ServerSocket(int port)
创建绑定到指定端口的服务器套接字。
|
ServerSocket(int port, int backlog)
创建服务器套接字并将其绑定到指定的本地端口号,并指定了积压。
|
ServerSocket(int port, int backlog, InetAddress bindAddr)
创建一个具有指定端口的服务器,侦听backlog和本地IP地址绑定。
|
Modifier and Type | Method and Description |
---|---|
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()
返回此套接字绑定到的端点的地址。
|
int |
getReceiveBufferSize()
|
boolean |
getReuseAddress()
测试是否启用了
SO_REUSEADDR 。
|
int |
getSoTimeout()
检索
SO_TIMEOUT 的设置。
|
protected void |
implAccept(Socket s)
ServerSocket的子类使用这个方法来覆盖accept()来返回自己的套接字子类。
|
boolean |
isBound()
返回ServerSocket的绑定状态。
|
boolean |
isClosed()
返回ServerSocket的关闭状态。
|
void |
setPerformancePreferences(int connectionTime, int latency, int bandwidth)
设置此ServerSocket的性能首选项。
|
void |
setReceiveBufferSize(int size)
设置从
ServerSocket 接受的套接字的
SO_RCVBUF 选项的默认建议值。
|
void |
setReuseAddress(boolean on)
启用/禁用
SO_REUSEADDR 套接字选项。
|
static void |
setSocketFactory(SocketImplFactory fac)
设置应用程序的服务器套接字实现工厂。
|
void |
setSoTimeout(int timeout)
启用/禁用
SO_TIMEOUT 带有指定超时,以毫秒为单位。
|
String |
toString()
将该套接字的实现地址和实现端口返回为
String 。
|
public ServerSocket() throws IOException
IOException
- 打开插槽时的IO错误。
public ServerSocket(int port) throws IOException
0
表示端口号是自动分配的,通常是从短暂的端口范围。
这个端口号可以通过调用getLocalPort
来检索 。
输入连接指示(连接请求)的最大队列长度设置为50
。 如果连接指示在队列已满时到达,则连接被拒绝。
如果应用程序指定了服务器套接字工厂,则调用该工厂的createSocketImpl
方法来创建实际的套接字实现。 否则,将创建一个“普通”套接字。
如果有安全管理器, checkListen
方法被称为与port
作为其参数,以确保允许该操作。 这可能会导致SecurityException。
port
- 端口号,或
0
使用
0
分配的端口号。
IOException
- 打开插槽时是否发生I / O错误。
SecurityException
- 如果安全管理器存在,并且其
checkListen
方法不允许操作。
IllegalArgumentException
- 如果端口参数超出了指定的有效端口值范围(介于0和65535之间),包括0和65535之间。
SocketImpl
, SocketImplFactory.createSocketImpl()
, setSocketFactory(java.net.SocketImplFactory)
, SecurityManager.checkListen(int)
public ServerSocket(int port, int backlog) throws IOException
0
表示端口号自动分配,通常是从短暂端口范围。
这个端口号可以通过调用getLocalPort
来检索 。
输入连接指示(连接请求)的最大队列长度设置为backlog
参数。 如果连接指示在队列已满时到达,则连接被拒绝。
如果应用程序指定了服务器套接字工厂,则调用该工厂的createSocketImpl
方法来创建实际的套接字实现。 否则,将创建一个“普通”套接字。
如果有安全管理器, checkListen
方法被称为与port
作为其参数,以确保允许该操作。 这可能会导致SecurityException。 backlog
参数是套接字上请求的最大挂起连接数。 其确切语义是实现具体的。 特别地,实现可以施加最大长度,或者可以选择忽略参数altogther。 提供的价值应大于0
。 如果它小于或等于0
,则将使用实现特定的默认值。
port
- 端口号,或
0
使用
0
分配的端口号。
backlog
- 请求进入连接队列的最大长度。
IOException
- 打开插槽时是否发生I / O错误。
SecurityException
- 如果安全管理器存在,并且其
checkListen
方法不允许操作。
IllegalArgumentException
- 如果端口参数超出了介于0和65535之间的有效端口值的指定范围(包括0和65535之间)。
SocketImpl
, SocketImplFactory.createSocketImpl()
, setSocketFactory(java.net.SocketImplFactory)
, SecurityManager.checkListen(int)
public ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException
0
表示端口号自动分配,通常来自短暂的端口范围。
这个端口号可以通过调用getLocalPort
来检索 。
如果有安全管理器,此方法调用其checkListen
方法与port
作为其参数,以确保允许该操作。 这可能会导致SecurityException。 backlog
参数是套接字上请求的最大挂起连接数。 其确切语义是实现具体的。 特别地,实现可以施加最大长度,或者可以选择忽略参数altogther。 提供的价值应大于0
。 如果小于或等于0
,则将使用实现特定的默认值。
port
- 端口号,或
0
使用
0
分配的端口号。
backlog
- 请求进入连接队列的最大长度。
bindAddr
- 服务器将绑定到的本地InetAddress
SecurityException
- 如果存在安全管理员,并且其
checkListen
方法不允许操作。
IOException
- 打开插槽时是否发生I / O错误。
IllegalArgumentException
- 如果端口参数超出了有效端口值的指定范围(介于0和65535之间),包括0和65535之间。
SocketOptions
, SocketImpl
, SecurityManager.checkListen(int)
public void bind(SocketAddress endpoint) throws IOException
ServerSocket
绑定到特定地址(IP地址和端口号)。
如果地址为null
,则系统将接收临时端口和有效的本地地址来绑定套接字。
endpoint
- 绑定到的IP地址和端口号。
IOException
- 如果绑定操作失败,或者套接字已经绑定。
SecurityException
- 如果一个
SecurityManager
存在,其
checkListen
方法不允许操作。
IllegalArgumentException
- 如果端点是此套接字不支持的SocketAddress子类
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子类
public InetAddress getInetAddress()
如果套接字被绑定在closed
之前,则该方法将在套接字关闭后继续返回本地地址。
如果有一个安全管理器集,其checkConnect
方法checkConnect
本地地址和-1
作为参数来调用,以查看是否允许该操作。 如果不允许操作,则返回loopback
地址。
null
。
SecurityManager.checkConnect(java.lang.String, int)
public int getLocalPort()
如果套接字被绑定在closed
之前,则该方法将在套接字关闭后继续返回端口号。
public SocketAddress getLocalSocketAddress()
如果套接字被绑定在closed
之前,则该方法将在套接字关闭后继续返回端点的地址。
如果有一个安全管理器集,其checkConnect
方法checkConnect
本地地址和-1
作为参数来调用,以查看是否允许该操作。 如果不允许操作,则SocketAddress
表示loopback
地址的SocketAddress和套接字所绑定的本地端口。
SocketAddress
该套接字的本地端点的
SocketAddress
,或者如果安全管理器拒绝,则表示该环回地址的
null
如果套接字尚未绑定,
null
。
getInetAddress()
,
getLocalPort()
,
bind(SocketAddress)
,
SecurityManager.checkConnect(java.lang.String, int)
public Socket accept() throws IOException
创建一个新的Socket s
,如果有安全管理器,则使用s.getInetAddress().getHostAddress()
和s.getPort()
作为其参数来调用安全管理器的checkAccept
方法,以确保允许操作。 这可能会导致SecurityException。
IOException
- 如果在等待连接时发生I / O错误。
SecurityException
- 如果安全管理器存在,并且其
checkAccept
方法不允许操作。
SocketTimeoutException
- 如果先前使用setSoTimeout设置了超时并且达到超时。
IllegalBlockingModeException
- 如果此套接字具有关联的通道,则该通道处于非阻塞模式,并且没有准备接受的连接
SecurityManager.checkAccept(java.lang.String, int)
protected final void implAccept(Socket s) throws IOException
s
- 套接字
IllegalBlockingModeException
- 如果此套接字具有关联的通道,并且通道处于非阻塞模式
IOException
- 如果在等待连接时发生I / O错误。
public void close() throws IOException
close
在接口
Closeable
close
中的
AutoCloseable
IOException
- 如果关闭套接字时发生I / O错误。
public ServerSocketChannel getChannel()
ServerSocketChannel
对象(如果有)。
如果只有通道本身是通过ServerSocketChannel.open
方法创建的,则服务器套接字将具有通道。
null
public boolean isBound()
public boolean isClosed()
public void setSoTimeout(int timeout) throws SocketException
SO_TIMEOUT
带有指定超时,以毫秒为单位。
使用此选项设置为非零超时,对此ServerSocket的accept()的调用将仅阻止此时间。
如果超时超时, 则会引发java.net.SocketTimeoutException ,尽管ServerSocket仍然有效。
必须先启用该选项才能进入阻止操作才能生效。
超时时间必须为> 0
。
超时为零被解释为无限超时。
timeout
- 指定的超时,以毫秒为单位
SocketException
- 如果底层协议有错误,如TCP错误。
getSoTimeout()
public int getSoTimeout() throws IOException
SO_TIMEOUT
的设置。
0返回意味着该选项被禁用(即无限超时)。
SO_TIMEOUT
的价值
IOException
- 如果发生I / O错误
setSoTimeout(int)
public void setReuseAddress(boolean on) throws SocketException
SO_REUSEADDR
套接字选项。
当TCP连接关闭时,连接可能会在连接关闭后一段时间内保持在超时状态(通常称为TIME_WAIT
状态或2MSL
等待状态)。 对于使用众所周知的套接字地址或端口的应用SocketAddress
如果在涉及套接字地址或端口的超时状态中存在连接,则可能无法将套接字绑定到所需的SocketAddress
。
启用SO_REUSEADDR
之前结合使用套接字bind(SocketAddress)
允许在上一个连接处于超时状态时绑定套接字。
当ServerSocket
被创建的初始设定SO_REUSEADDR
没有定义。 应用程序可以使用getReuseAddress()
来确定初始设置为SO_REUSEADDR
。
套接字绑定后启用或禁用SO_REUSEADDR
时的行为(见isBound()
)未定义。
on
- 是否启用或禁用套接字选项
SocketException
- 如果出现错误,启用或禁用
SO_REUSEADDR
套接字选项,或者插座已关闭。
getReuseAddress()
,
bind(SocketAddress)
,
isBound()
,
isClosed()
public boolean getReuseAddress() throws SocketException
SO_REUSEADDR
。
boolean
是否启用
SO_REUSEADDR
的boolean 。
SocketException
- 如果底层协议有错误,例如TCP错误。
setReuseAddress(boolean)
public String toString()
String
。
如果有一个安全管理器集,它的checkConnect
方法被调用本地地址和-1
作为参数来查看是否允许该操作。 如果不允许的操作, InetAddress
代表loopback
个地址返回作为实现地址。
public static void setSocketFactory(SocketImplFactory fac) throws IOException
当应用程序创建新的服务器套接字时,将调用套接字实现工厂的createSocketImpl
方法来创建实际的套接字实现。
通过null
的方法是一个no-op,除非工厂已经设置。
如果有安全管理员,则该方法首先调用安全管理器的checkSetFactory
方法,以确保允许操作。 这可能会导致SecurityException。
fac
- 所需工厂。
IOException
- 设置插座工厂时是否发生I / O错误。
SocketException
- 如果工厂已经被定义。
SecurityException
- 如果存在安全管理员,并且其
checkSetFactory
方法不允许操作。
SocketImplFactory.createSocketImpl()
,
SecurityManager.checkSetFactory()
public void setReceiveBufferSize(int size) throws SocketException
SO_RCVBUF
选项从该接受的套接字ServerSocket
。
在接受的套接字中实际设置的值必须通过在accept()
返回套接字后调用Socket.getReceiveBufferSize()
来确定 。
SO_RCVBUF
的值用于设置内部套接字接收缓冲区的大小,并设置通告给远程对等体的TCP接收窗口的大小。
可以通过调用Socket.setReceiveBufferSize(int)
来随后更改值。 然而,如果应用程序希望允许大于64K字节的接收窗口,如RFC1323定义的那样,则在ServerSocket绑定到本地地址之前必须设置建议值。 这意味着必须使用无参数构造函数创建ServerSocket,那么必须调用setReceiveBufferSize(),最后调用bind()将ServerSocket绑定到一个地址。
否则不会导致错误,并且缓冲区大小可能设置为请求的值,但从该ServerSocket接受的套接字中的TCP接收窗口将不会大于64K字节。
size
- 设置接收缓冲区大小的大小。
该值必须大于0。
SocketException
- 如果底层协议有错误,如TCP错误。
IllegalArgumentException
- 如果值为0或为负。
getReceiveBufferSize()
public int getReceiveBufferSize() throws SocketException
SO_RCVBUF
选项这个ServerSocket
,这是将用于从此接受的套接字的建议缓冲区大小ServerSocket
。
注意,在接受的套接字中实际设置的值是通过调用Socket.getReceiveBufferSize()
确定的 。
SO_RCVBUF
期权的价值为
Socket
。
SocketException
- 如果底层协议有错误,如TCP错误。
setReceiveBufferSize(int)
public void setPerformancePreferences(int connectionTime, int latency, int bandwidth)
套接字默认使用TCP / IP协议。 一些实现可以提供具有与TCP / IP不同的性能特征的替代协议。 该方法允许应用程序表达自己的偏好,以便在实现从可用协议中选择时应如何进行这些权衡。
性能偏好由三个整数描述,其值表示短连接时间,低延迟和高带宽的相对重要性。 整数的绝对值是无关紧要的; 为了选择协议,简单地比较值,较大的值表示较强的偏好。 例如,如果应用程序优先考虑低延迟和高带宽的短连接时间,则可以使用值(1, 0, 0)
调用此方法。 如果应用程序喜欢低于低延迟的高带宽,并且在短的连接时间以上的低延迟,则可以使用值(0, 1, 2)
调用此方法。
在此套接字绑定后调用此方法将不起作用。 这意味着为了使用此功能,需要使用无参数构造函数创建套接字。
connectionTime
-一个
int
表达短连接时间的相对重要性
latency
-
int
低延迟的相对重要性的int
bandwidth
-一个
int
表达高带宽的相对重要性