public class Socket
extends Object
implements Closeable
java.lang.Object | |
↳ | java.net.Socket |
Known Direct Subclasses |
这个类实现客户端套接字(也称为“套接字”)。 套接字是两台机器之间通信的端点。
套接字的实际工作由SocketImpl
类的一个实例执行。 通过更改创建套接字实现的套接字工厂,应用程序可以将自身配置为创建适合本地防火墙的套接字。
Public constructors |
|
---|---|
Socket() 使用系统默认类型的SocketImpl创建一个未连接的套接字。 |
|
Socket(Proxy proxy) 创建一个未连接的套接字,指定应该使用的代理类型(如果有),而不管其他设置如何。 |
|
Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上的指定端口号。 |
|
Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指定IP地址的指定端口号。 |
|
Socket(String host, int port, InetAddress localAddr, int localPort) 创建套接字并将其连接到指定远程端口上的指定远程主机。 |
|
Socket(InetAddress address, int port, InetAddress localAddr, int localPort) 创建套接字并将其连接到指定远程端口上的指定远程地址。 |
|
Socket(String host, int port, boolean stream) 此构造函数在API级别1中已弃用。使用DatagramSocket代替UDP传输。 |
|
Socket(InetAddress host, int port, boolean stream) 此构造函数在API级别1中已弃用。使用DatagramSocket代替UDP传输。 |
Protected constructors |
|
---|---|
Socket(SocketImpl impl) 用用户指定的SocketImpl创建一个未连接的Socket。 |
Public methods |
|
---|---|
void |
bind(SocketAddress bindpoint) 将套接字绑定到本地地址。 |
void |
close() 关闭此插座。 |
void |
connect(SocketAddress endpoint, int timeout) 用指定的超时值将此套接字连接到服务器。 |
void |
connect(SocketAddress endpoint) 将此套接字连接到服务器。 |
SocketChannel |
getChannel() 返回与此套接字关联的唯一 |
InetAddress |
getInetAddress() 返回套接字连接的地址。 |
InputStream |
getInputStream() 返回此套接字的输入流。 |
boolean |
getKeepAlive() 测试是否启用SO_KEEPALIVE。 |
InetAddress |
getLocalAddress() 获取套接字绑定到的本地地址。 |
int |
getLocalPort() 返回此套接字绑定到的本地端口号。 |
SocketAddress |
getLocalSocketAddress() 返回此套接字绑定的端点的地址,如果尚未绑定,则 |
boolean |
getOOBInline() 测试是否启用OOBINLINE。 |
OutputStream |
getOutputStream() 返回此套接字的输出流。 |
int |
getPort() 返回此套接字连接到的远程端口号。 |
int |
getReceiveBufferSize() 获取此 Socket的SO_RCVBUF选项的值,即此平台在此 Socket上用于输入的缓冲区大小。 |
SocketAddress |
getRemoteSocketAddress() 返回此套接字连接的端点的地址,如果未连接,则 |
boolean |
getReuseAddress() 测试SO_REUSEADDR是否启用。 |
int |
getSendBufferSize() 获取此 Socket的SO_SNDBUF选项的值,即平台在此 Socket上用于输出的缓冲区大小。 |
int |
getSoLinger() 返回SO_LINGER的设置。 |
int |
getSoTimeout() 返回SO_TIMEOUT的设置。 |
boolean |
getTcpNoDelay() 测试是否启用TCP_NODELAY。 |
int |
getTrafficClass() 从此套接字发送的数据包的IP头中获取流量类别或服务类型 由于底层网络实现可能会忽略使用 |
boolean |
isBound() 返回套接字的绑定状态。 |
boolean |
isClosed() 返回套接字的关闭状态。 |
boolean |
isConnected() 返回套接字的连接状态。 |
boolean |
isInputShutdown() 返回是否关闭套接字连接的半读。 |
boolean |
isOutputShutdown() 返回是否关闭了套接字连接的写入一半。 |
void |
sendUrgentData(int data) 在套接字上发送一个字节的紧急数据。 |
void |
setKeepAlive(boolean on) 启用/禁用SO_KEEPALIVE。 |
void |
setOOBInline(boolean on) 启用/禁用OOBINLINE(接收TCP紧急数据)默认情况下,此选项被禁用,并且套接字上收到的TCP紧急数据将被静默丢弃。 |
void |
setPerformancePreferences(int connectionTime, int latency, int bandwidth) 为此套接字设置性能首选项。 |
void |
setReceiveBufferSize(int size) 将SO_RCVBUF选项设置为此 Socket的指定值。 |
void |
setReuseAddress(boolean on) 启用/禁用SO_REUSEADDR套接字选项。 |
void |
setSendBufferSize(int size) 将SO_SNDBUF选项设置为此 Socket的指定值。 |
void |
setSoLinger(boolean on, int linger) 使用指定的逗留时间(以秒为单位)启用/禁用SO_LINGER。 |
void |
setSoTimeout(int timeout) 使用指定的超时启用/禁用SO_TIMEOUT,以毫秒为单位。 |
static void |
setSocketImplFactory(SocketImplFactory fac) 为应用程序设置客户端套接字实现工厂。 |
void |
setTcpNoDelay(boolean on) 启用/禁用TCP_NODELAY(禁用/启用Nagle的算法)。 |
void |
setTrafficClass(int tc) 为从此Socket发送的数据包设置IP头中的流量类别或服务类型八位字节。 |
void |
shutdownInput() 将此套接字的输入流置于“流尾”。 |
void |
shutdownOutput() 禁用此套接字的输出流。 |
String |
toString() 将此套接字转换为 |
Inherited methods |
|
---|---|
From class java.lang.Object
|
|
From interface java.io.Closeable
|
|
From interface java.lang.AutoCloseable
|
Socket (Proxy proxy)
创建一个未连接的套接字,指定应该使用的代理类型(如果有),而不管其他设置如何。
如果有安全管理器,则使用代理主机地址和端口号作为其参数调用其checkConnect
方法。 这可能会导致SecurityException。
例子:
Socket s = new Socket(Proxy.NO_PROXY);
will create a plain socket ignoring any other proxy configuration.Socket s = new Socket(new Proxy(Proxy.Type.SOCKS, new InetSocketAddress("socks.mydom.com", 1080)));
will create a socket connecting through the specified SOCKS proxy server.Parameters | |
---|---|
proxy |
Proxy : a Proxy object specifying what kind of proxying should be used. |
Throws | |
---|---|
IllegalArgumentException |
if the proxy is of an invalid type or null . |
SecurityException |
if a security manager is present and permission to connect to the proxy is denied. |
也可以看看:
Socket (String host, int port)
创建一个流套接字并将其连接到指定主机上的指定端口号。
如果指定的主机是null ,则相当于将地址指定为InetAddress.getByName
(null) 。 换句话说,它等同于指定回送接口的地址。
如果应用程序指定了一个服务器套接字工厂,那么将调用该工厂的createSocketImpl
方法来创建实际的套接字实现。 否则,会创建一个“普通”套接字。
如果有安全管理器,则使用主机地址和port
作为参数调用其checkConnect
方法。 这可能会导致SecurityException。
Parameters | |
---|---|
host |
String : the host name, or null for the loopback address. |
port |
int : the port number. |
Throws | |
---|---|
UnknownHostException |
if the IP address of the host could not be determined. |
IOException |
if an I/O error occurs when creating the socket. |
SecurityException |
if a security manager exists and its checkConnect method doesn't allow the operation. |
IllegalArgumentException |
if the port parameter is outside the specified range of valid port values, which is between 0 and 65535, inclusive. |
Socket (InetAddress address, int port)
创建一个流套接字并将其连接到指定IP地址的指定端口号。
如果应用程序指定了一个套接字工厂,那么将调用该工厂的createSocketImpl
方法来创建实际的套接字实现。 否则,会创建一个“普通”套接字。
如果有安全管理器, checkConnect
主机地址和port
作为参数调用其checkConnect
方法。 这可能会导致SecurityException。
Parameters | |
---|---|
address |
InetAddress : the IP address. |
port |
int : the port number. |
Throws | |
---|---|
IOException |
if an I/O error occurs when creating the socket. |
SecurityException |
if a security manager exists and its checkConnect method doesn't allow the operation. |
IllegalArgumentException |
if the port parameter is outside the specified range of valid port values, which is between 0 and 65535, inclusive. |
NullPointerException |
if address is null. |
Socket (String host, int port, InetAddress localAddr, int localPort)
创建套接字并将其连接到指定远程端口上的指定远程主机。 Socket还将bind()提供给本地地址和端口。
如果指定的主机是null ,则相当于将地址指定为InetAddress.getByName
(null) 。 换句话说,它等同于指定回送接口的地址。
本地端口号 zero
将让系统在 bind
操作中选取一个空闲端口。
如果有安全管理器,则使用主机地址和port
作为参数调用其checkConnect
方法。 这可能会导致SecurityException。
Parameters | |
---|---|
host |
String : the name of the remote host, or null for the loopback address. |
port |
int : the remote port |
localAddr |
InetAddress : the local address the socket is bound to, or null for the anyLocal address. |
localPort |
int : the local port the socket is bound to, or zero for a system selected free port. |
Throws | |
---|---|
IOException |
if an I/O error occurs when creating the socket. |
SecurityException |
if a security manager exists and its checkConnect method doesn't allow the operation. |
IllegalArgumentException |
if the port parameter or localPort parameter is outside the specified range of valid port values, which is between 0 and 65535, inclusive. |
也可以看看:
Socket (InetAddress address, int port, InetAddress localAddr, int localPort)
创建套接字并将其连接到指定远程端口上的指定远程地址。 Socket还将bind()提供给本地地址和端口。
如果指定的本地地址是 null ,则相当于将地址指定为AnyLocal地址(请参阅 InetAddress.isAnyLocalAddress
() )。
本地端口号 zero
将使系统获取 bind
操作中的空闲端口。
如果有安全管理器,则使用主机地址和port
作为其参数调用其checkConnect
方法。 这可能会导致SecurityException。
Parameters | |
---|---|
address |
InetAddress : the remote address |
port |
int : the remote port |
localAddr |
InetAddress : the local address the socket is bound to, or null for the anyLocal address. |
localPort |
int : the local port the socket is bound to or zero for a system selected free port. |
Throws | |
---|---|
IOException |
if an I/O error occurs when creating the socket. |
SecurityException |
if a security manager exists and its checkConnect method doesn't allow the operation. |
IllegalArgumentException |
if the port parameter or localPort parameter is outside the specified range of valid port values, which is between 0 and 65535, inclusive. |
NullPointerException |
if address is null. |
也可以看看:
Socket (String host, int port, boolean stream)
此构造函数在API级别1中已弃用。
使用DatagramSocket代替UDP传输。
创建一个流套接字并将其连接到指定主机上的指定端口号。
如果指定的主机是null ,则相当于将地址指定为InetAddress.getByName
(null) 。 换句话说,它等同于指定回送接口的地址。
如果流参数是true
,则会创建一个流套接字。 如果流参数是false
,它会创建一个数据报套接字。
如果应用程序指定了一个服务器套接字工厂,那么将调用该工厂的createSocketImpl
方法来创建实际的套接字实现。 否则,会创建一个“普通”套接字。
如果有安全管理器,则使用主机地址和port
作为参数调用其checkConnect
方法。 这可能会导致SecurityException。
如果使用UDP套接字,则TCP / IP相关套接字选项将不适用。
Parameters | |
---|---|
host |
String : the host name, or null for the loopback address. |
port |
int : the port number. |
stream |
boolean : a boolean indicating whether this is a stream socket or a datagram socket. |
Throws | |
---|---|
IOException |
if an I/O error occurs when creating the socket. |
SecurityException |
if a security manager exists and its checkConnect method doesn't allow the operation. |
IllegalArgumentException |
if the port parameter is outside the specified range of valid port values, which is between 0 and 65535, inclusive. |
Socket (InetAddress host, int port, boolean stream)
此构造函数在API级别1中已弃用。
使用DatagramSocket代替UDP传输。
创建一个套接字并将其连接到指定IP地址的指定端口号。
如果流参数是true
,则会创建一个流套接字。 如果流参数是false
,它将创建一个数据报套接字。
如果应用程序指定了服务器套接字工厂,则调用该工厂的createSocketImpl
方法来创建实际的套接字实现。 否则,会创建一个“普通”套接字。
如果有安全管理器, checkConnect
host.getHostAddress()
和port
作为参数调用其checkConnect
方法。 这可能会导致SecurityException。
如果使用UDP套接字,则TCP / IP相关的套接字选项将不适用。
Parameters | |
---|---|
host |
InetAddress : the IP address. |
port |
int : the port number. |
stream |
boolean : if true , create a stream socket; otherwise, create a datagram socket. |
Throws | |
---|---|
IOException |
if an I/O error occurs when creating the socket. |
SecurityException |
if a security manager exists and its checkConnect method doesn't allow the operation. |
IllegalArgumentException |
if the port parameter is outside the specified range of valid port values, which is between 0 and 65535, inclusive. |
NullPointerException |
if host is null. |
Socket (SocketImpl impl)
用用户指定的SocketImpl创建一个未连接的Socket。
Parameters | |
---|---|
impl |
SocketImpl : an instance of a SocketImpl the subclass wishes to use on the Socket. |
Throws | |
---|---|
SocketException |
if there is an error in the underlying protocol, such as a TCP error. |
void bind (SocketAddress bindpoint)
将套接字绑定到本地地址。
如果地址是 null
,那么系统将选择一个临时端口和一个有效的本地地址来绑定套接字。
Parameters | |
---|---|
bindpoint |
SocketAddress : the SocketAddress to bind to |
Throws | |
---|---|
IOException |
if the bind operation fails, or if the socket is already bound. |
IllegalArgumentException |
if bindpoint is a SocketAddress subclass not supported by this socket |
也可以看看:
void close ()
关闭此插座。
当前在此套接字上的I / O操作中被阻塞的任何线程将抛出 SocketException
。
套接字关闭后,它不能用于进一步的网络使用(即不能重新连接或反弹)。 需要创建一个新的套接字。
关闭此插座也将关闭插座的 InputStream
和 OutputStream
。
如果此套接字具有关联的通道,那么该通道也会关闭。
Throws | |
---|---|
IOException |
if an I/O error occurs when closing this socket. |
也可以看看:
void connect (SocketAddress endpoint, int timeout)
用指定的超时值将此套接字连接到服务器。 超时为零被解释为无限超时。 连接将阻塞直到建立或发生错误。
Parameters | |
---|---|
endpoint |
SocketAddress : the SocketAddress |
timeout |
int : the timeout value to be used in milliseconds. |
Throws | |
---|---|
IOException |
if an error occurs during the connection |
SocketTimeoutException |
if timeout expires before connecting |
IllegalBlockingModeException |
if this socket has an associated channel, and the channel is in non-blocking mode |
IllegalArgumentException |
if endpoint is null or is a SocketAddress subclass not supported by this socket |
void connect (SocketAddress endpoint)
将此套接字连接到服务器。
Parameters | |
---|---|
endpoint |
SocketAddress : the SocketAddress |
Throws | |
---|---|
IOException |
if an error occurs during the connection |
IllegalBlockingModeException |
if this socket has an associated channel, and the channel is in non-blocking mode |
IllegalArgumentException |
if endpoint is null or is a SocketAddress subclass not supported by this socket |
SocketChannel getChannel ()
返回与此套接字关联的唯一 SocketChannel
对象(如果有)。
如果且仅当通道本身是通过 SocketChannel.open
或 ServerSocketChannel.accept
方法创建的,则套接字将具有通道。
Returns | |
---|---|
SocketChannel |
the socket channel associated with this socket, or null if this socket was not created for a channel |
InetAddress getInetAddress ()
返回套接字连接的地址。
如果套接字在 closed
之前连接,那么在套接字关闭后,此方法将继续返回连接的地址。
Returns | |
---|---|
InetAddress |
the remote IP address to which this socket is connected, or null if the socket is not connected. |
InputStream getInputStream ()
返回此套接字的输入流。
如果此套接字具有关联的通道,则生成的输入流会将其所有操作委托给该通道。 如果通道处于非阻塞模式,则输入流的read操作将抛出IllegalBlockingModeException
。
在异常情况下,底层连接可能会被远程主机或网络软件破坏(例如TCP连接时的连接重置)。 当网络软件检测到连接断开时,以下内容适用于返回的输入流: -
网络软件可能丢弃由套接字缓冲的字节。 未被网络软件丢弃的字节可以使用read
读取。
如果套接字上没有缓冲字节,或者所有缓冲的字节已被 read
消耗,则后续对 read
所有调用 read
将抛出 IOException
。
关闭返回的 InputStream
将关闭相关的套接字。
Returns | |
---|---|
InputStream |
an input stream for reading bytes from this socket. |
Throws | |
---|---|
IOException |
if an I/O error occurs when creating the input stream, the socket is closed, the socket is not connected, or the socket input has been shutdown using shutdownInput() |
boolean getKeepAlive ()
测试是否启用SO_KEEPALIVE。
Returns | |
---|---|
boolean |
a boolean indicating whether or not SO_KEEPALIVE is enabled. |
Throws | |
---|---|
SocketException |
if there is an error in the underlying protocol, such as a TCP error. |
也可以看看:
InetAddress getLocalAddress ()
获取套接字绑定到的本地地址。
Returns | |
---|---|
InetAddress |
the local address to which the socket is bound, or the wildcard address if the socket is closed or not bound yet. |
int getLocalPort ()
返回此套接字绑定到的本地端口号。
如果套接字在 closed
之前被 closed
,那么在套接字关闭后,此方法将继续返回本地端口号。
Returns | |
---|---|
int |
the local port number to which this socket is bound or -1 if the socket is not bound yet. |
SocketAddress getLocalSocketAddress ()
返回此套接字绑定的端点的地址,如果尚未绑定,则 null
。
如果绑定到由InetSocketAddress
表示的端点的InetSocketAddress
是closed
,那么在套接字关闭后,此方法将继续返回InetSocketAddress
。 在这种情况下,返回的InetSocketAddress
的地址是wildcard
地址,其端口是它绑定到的本地端口。
Returns | |
---|---|
SocketAddress |
a SocketAddress representing the local endpoint of this socket, or null if it is not bound yet. |
boolean getOOBInline ()
测试是否启用OOBINLINE。
Returns | |
---|---|
boolean |
a boolean indicating whether or not OOBINLINE is enabled. |
Throws | |
---|---|
SocketException |
if there is an error in the underlying protocol, such as a TCP error. |
也可以看看:
OutputStream getOutputStream ()
返回此套接字的输出流。
如果此套接字具有关联的通道,则生成的输出流会将其所有操作委托给该通道。 如果通道处于非阻塞模式,那么输出流的write操作将抛出IllegalBlockingModeException
。
关闭返回的 OutputStream
将关闭相关的套接字。
Returns | |
---|---|
OutputStream |
an output stream for writing bytes to this socket. |
Throws | |
---|---|
IOException |
if an I/O error occurs when creating the output stream or if the socket is not connected. |
int getPort ()
返回此套接字连接到的远程端口号。
如果套接字在 closed
之前已连接,那么在套接字关闭后,此方法将继续返回连接的端口号。
Returns | |
---|---|
int |
the remote port number to which this socket is connected, or 0 if the socket is not connected yet. |
int getReceiveBufferSize ()
获取此 Socket的SO_RCVBUF选项的值,即平台在此 Socket上用于输入的缓冲区大小。
Returns | |
---|---|
int |
the value of the SO_RCVBUF option for this Socket. |
Throws | |
---|---|
SocketException |
if there is an error in the underlying protocol, such as a TCP error. |
也可以看看:
SocketAddress getRemoteSocketAddress ()
返回此套接字连接的端点的地址,如果未连接,则 null
。
如果套接字在 closed
之前已连接,那么在套接字关闭后,此方法将继续返回连接的地址。
Returns | |
---|---|
SocketAddress |
a SocketAddress representing the remote endpoint of this socket, or null if it is not connected yet. |
boolean getReuseAddress ()
测试SO_REUSEADDR是否启用。
Returns | |
---|---|
boolean |
a boolean indicating whether or not SO_REUSEADDR is enabled. |
Throws | |
---|---|
SocketException |
if there is an error in the underlying protocol, such as a TCP error. |
也可以看看:
int getSendBufferSize ()
获取此 Socket的SO_SNDBUF选项的值,即此平台在此 Socket上用于输出的缓冲区大小。
Returns | |
---|---|
int |
the value of the SO_SNDBUF option for this Socket. |
Throws | |
---|---|
SocketException |
if there is an error in the underlying protocol, such as a TCP error. |
也可以看看:
int getSoLinger ()
返回SO_LINGER的设置。 -1返回意味着该选项被禁用。 该设置仅影响套接字关闭。
Returns | |
---|---|
int |
the setting for SO_LINGER. |
Throws | |
---|---|
SocketException |
if there is an error in the underlying protocol, such as a TCP error. |
也可以看看:
int getSoTimeout ()
返回SO_TIMEOUT的设置。 0返回意味着该选项被禁用(即,无限超时)。
Returns | |
---|---|
int |
the setting for SO_TIMEOUT |
Throws | |
---|---|
SocketException |
if there is an error in the underlying protocol, such as a TCP error. |
也可以看看:
boolean getTcpNoDelay ()
测试是否启用TCP_NODELAY。
Returns | |
---|---|
boolean |
a boolean indicating whether or not TCP_NODELAY is enabled. |
Throws | |
---|---|
SocketException |
if there is an error in the underlying protocol, such as a TCP error. |
也可以看看:
int getTrafficClass ()
从此套接字发送的数据包的IP头中获取流量类别或服务类型
由于底层网络实现可能会忽略使用 setTrafficClass(int)
的流量类别或服务类型集合, setTrafficClass(int)
此方法可能会返回与先前使用此Socket上的 setTrafficClass(int)
方法设置的值不同的值。
Returns | |
---|---|
int |
the traffic class or type-of-service already set |
Throws | |
---|---|
SocketException |
if there is an error obtaining the traffic class or type-of-service value. |
也可以看看:
boolean isBound ()
返回套接字的绑定状态。
注意:关闭套接字不会清除其绑定状态,这意味着如果在关闭之前它成功绑定,此方法将为封闭套接字返回 true
(请参阅 isClosed()
)。
Returns | |
---|---|
boolean |
true if the socket was successfuly bound to an address |
也可以看看:
boolean isClosed ()
返回套接字的关闭状态。
Returns | |
---|---|
boolean |
true if the socket has been closed |
也可以看看:
boolean isConnected ()
返回套接字的连接状态。
注意:关闭套接字不会清除其连接状态,这意味着如果在关闭套接字之前连接成功,则此方法将为封闭套接字返回 true
(请参阅 isClosed()
)。
Returns | |
---|---|
boolean |
true if the socket was successfuly connected to a server |
boolean isInputShutdown ()
返回是否关闭套接字连接的半读。
Returns | |
---|---|
boolean |
true if the input of the socket has been shutdown |
也可以看看:
boolean isOutputShutdown ()
返回是否关闭了套接字连接的写入一半。
Returns | |
---|---|
boolean |
true if the output of the socket has been shutdown |
也可以看看:
void sendUrgentData (int data)
在套接字上发送一个字节的紧急数据。 要发送的字节是数据参数的最低八位。 紧接着的字节在任何之前写入套接字OutputStream之后以及将来写入OutputStream之前发送。
Parameters | |
---|---|
data |
int : The byte of data to send |
Throws | |
---|---|
IOException |
if there is an error sending the data. |
void setKeepAlive (boolean on)
启用/禁用SO_KEEPALIVE。
Parameters | |
---|---|
on |
boolean : whether or not to have socket keep alive turned on. |
Throws | |
---|---|
SocketException |
if there is an error in the underlying protocol, such as a TCP error. |
也可以看看:
void setOOBInline (boolean on)
启用/禁用OOBINLINE(接收TCP紧急数据)默认情况下,此选项被禁用,并且套接字上收到的TCP紧急数据将被静默丢弃。 如果用户希望接收紧急数据,则必须启用该选项。 启用后,紧急数据将与正常数据内联接收。
请注意,只有有限的支持才能处理传入的紧急数据。 特别是,没有提供传入紧急数据的通知,并且除非由更高级协议提供,否则不能区分正常数据和紧急数据。
Parameters | |
---|---|
on |
boolean : true to enable OOBINLINE, false to disable. |
Throws | |
---|---|
SocketException |
if there is an error in the underlying protocol, such as a TCP error. |
也可以看看:
void setPerformancePreferences (int connectionTime, int latency, int bandwidth)
为此套接字设置性能首选项。
套接字默认使用TCP / IP协议。 某些实现可能提供具有与TCP / IP不同的性能特征的替代协议。 该方法允许应用程序表达自己的偏好,以便在实现从可用协议中选择时如何进行这些折衷。
性能首选项由三个整数描述,其值表示短连接时间,低延迟和高带宽的相对重要性。 整数的绝对值是无关紧要的; 为了选择一个协议,简单地比较这些值,较大的值表示较强的偏好。 负值表示比正值低的优先级。 例如,如果应用程序比低延迟和高带宽更喜欢短连接时间,则可以使用值(1, 0, 0)来调用此方法。 如果应用程序偏好低延迟以上的高带宽,并且短连接时间以上的延迟较低,则可以使用值(0, 1, 2)调用此方法。
在此套接字连接后调用此方法将不起作用。
Parameters | |
---|---|
connectionTime |
int : An int expressing the relative importance of a short connection time |
latency |
int : An int expressing the relative importance of low latency |
bandwidth |
int : An int expressing the relative importance of high bandwidth |
void setReceiveBufferSize (int size)
将SO_RCVBUF选项设置为此Socket的指定值。 平台的网络代码使用SO_RCVBUF选项作为设置底层网络I / O缓冲区大小的提示。
增加接收缓冲区大小可以提高高容量连接的网络I / O性能,而降低接收缓冲区大小可以帮助减少传入数据的积压。
因为SO_RCVBUF是一个提示,所以想要验证缓冲区大小的应用程序应该调用 getReceiveBufferSize()
。
SO_RCVBUF的值也用于设置通告给远程对等端的TCP接收窗口。 通常,在连接套接字时,可以随时修改窗口大小。 但是,如果需要大于64K的接收窗口,则必须在套接字连接到远程对等点之前请求该窗口。 有两种情况需要注意:
setReceiveBufferSize(int)
before the ServerSocket is bound to a local address.Parameters | |
---|---|
size |
int : the size to which to set the receive buffer size. This value must be greater than 0. |
Throws | |
---|---|
IllegalArgumentException |
if the value is 0 or is negative. |
SocketException |
if there is an error in the underlying protocol, such as a TCP error. |
void setReuseAddress (boolean on)
启用/禁用SO_REUSEADDR套接字选项。
当TCP连接关闭时,连接关闭后连接可能会保持超时状态一段时间(通常称为TIME_WAIT状态或2MSL等待状态)。 对于使用众所周知的套接字地址或端口的应用程序,如果在涉及套接字地址或端口的超时状态中存在连接,则可能无法将套接字绑定到所需的SocketAddress 。
在使用 bind(SocketAddress)
绑定套接字之前启用 SO_REUSEADDR允许套接字绑定,即使先前的连接处于超时状态。
创建 Socket时 ,初始设置 SO_REUSEADDR被禁用。
未定义绑定套接字后启用或禁用 SO_REUSEADDR时的行为(请参阅 isBound()
)。
Parameters | |
---|---|
on |
boolean : whether to enable or disable the socket option |
Throws | |
---|---|
SocketException |
if an error occurs enabling or disabling the SO_RESUEADDR socket option, or the socket is closed. |
void setSendBufferSize (int size)
将SO_SNDBUF选项设置为此Socket的指定值。 平台的网络代码使用SO_SNDBUF选项作为设置底层网络I / O缓冲区大小的提示。
因为SO_SNDBUF是一个提示,所以想要验证缓冲区大小的应用程序应该调用 getSendBufferSize()
。
Parameters | |
---|---|
size |
int : the size to which to set the send buffer size. This value must be greater than 0. |
Throws | |
---|---|
SocketException |
if there is an error in the underlying protocol, such as a TCP error. |
IllegalArgumentException |
if the value is 0 or is negative. |
也可以看看:
void setSoLinger (boolean on, int linger)
使用指定的逗留时间(以秒为单位)启用/禁用SO_LINGER。 最大超时值是平台特定的。 该设置仅影响套接字关闭。
Parameters | |
---|---|
on |
boolean : whether or not to linger on. |
linger |
int : how long to linger for, if on is true. |
Throws | |
---|---|
SocketException |
if there is an error in the underlying protocol, such as a TCP error. |
IllegalArgumentException |
if the linger value is negative. |
也可以看看:
void setSoTimeout (int timeout)
使用指定的超时启用/禁用SO_TIMEOUT,以毫秒为单位。 如果将此选项设置为非零超时,则与此Socket关联的InputStream上的read()调用将仅阻塞这段时间。 如果超时过期,则会引发java.net.SocketTimeoutException ,但Socket仍然有效。 该选项必须在进入阻止操作生效之前启用。 超时值必须大于0.超时值为零将被解释为无限超时。
Parameters | |
---|---|
timeout |
int : the specified timeout, in milliseconds. |
Throws | |
---|---|
SocketException |
if there is an error in the underlying protocol, such as a TCP error. |
也可以看看:
void setSocketImplFactory (SocketImplFactory fac)
为应用程序设置客户端套接字实现工厂。 工厂只能指定一次。
当应用程序创建新的客户端套接字时,将调用套接字实现工厂的方法 createSocketImpl
来创建实际的套接字实现。
除非工厂已经设置,否则将 null
传递给该方法是无操作的。
如果有安全管理器,则此方法首先调用安全管理器的方法checkSetFactory
以确保允许操作。 这可能会导致SecurityException。
Parameters | |
---|---|
fac |
SocketImplFactory : the desired factory. |
Throws | |
---|---|
IOException |
if an I/O error occurs when setting the socket factory. |
SocketException |
if the factory is already defined. |
SecurityException |
if a security manager exists and its checkSetFactory method doesn't allow the operation. |
void setTcpNoDelay (boolean on)
启用/禁用TCP_NODELAY(禁用/启用Nagle的算法)。
Parameters | |
---|---|
on |
boolean : true to enable TCP_NODELAY, false to disable. |
Throws | |
---|---|
SocketException |
if there is an error in the underlying protocol, such as a TCP error. |
也可以看看:
void setTrafficClass (int tc)
为从此Socket发送的数据包设置IP头中的流量类别或服务类型八位字节。 由于底层网络实施可能会忽略此值,因此应用程序应将其视为暗示。
tc 必须在 0 <= tc <= 255
范围内, 0 <= tc <= 255
将抛出IllegalArgumentException。
笔记:
对于Internet协议v4,其值由integer
组成,其最低有效位8位表示由套接字发送的IP数据包中的TOS八位组的值。 RFC 1349定义了TOS值如下:
IPTOS_LOWCOST (0x02)
IPTOS_RELIABILITY (0x04)
IPTOS_THROUGHPUT (0x08)
IPTOS_LOWDELAY (0x10)
在优先级字段中设置位可能会导致SocketException,表示操作不被允许。
正如RFC 1122第4.2.4.2节所指出的那样,一个兼容的TCP实现应该但并非必须让应用程序在连接的生命周期中更改TOS字段。 因此,建立TCP连接之后服务类型字段是否可以改变取决于底层平台的实现。 应用程序不应该假设他们可以在连接后更改TOS字段。
对于Internet协议版本6 tc
是将放置在IP标头的sin6_flowinfo字段中的值。
Parameters | |
---|---|
tc |
int : an int value for the bitset. |
Throws | |
---|---|
SocketException |
if there is an error setting the traffic class or type-of-service |
也可以看看:
void shutdownInput ()
将此套接字的输入流置于“流尾”。 发送到套接字的输入流一侧的任何数据都会被确认,然后以静默方式丢弃。
如果您在套接字上调用shutdownInput()之后从套接字输入流读取,则该流将返回EOF。
Throws | |
---|---|
IOException |
if an I/O error occurs when shutting down this socket. |
void shutdownOutput ()
禁用此套接字的输出流。 对于TCP套接字,任何先前写入的数据将在TCP的正常连接终止序列后发送。 如果在套接字上调用shutdownOutput()之后写入套接字输出流,则该流将抛出IOException。
Throws | |
---|---|
IOException |
if an I/O error occurs when shutting down this socket. |
String toString ()
将此套接字转换为 String
。
Returns | |
---|---|
String |
a string representation of this socket. |