SocketOptions
public interface SocketOptions
获取/设置套接字选项的方法接口。 该接口由:SocketImpl 和 DatagramSocketImpl 实现。 这些子类应该覆盖这个接口的方法,以支持他们自己的选项。
在此接口中指定选项的方法和常量仅用于实现。 如果您没有继承 SocketImpl 或 DatagramSocketImpl,则不会直接使用它们。 在 Socket、ServerSocket、DatagramSocket 和 MulticastSocket 中有类型安全的方法来获取/设置这些选项。
字段摘要
修饰符和类型 | 字段 | 描述 |
---|---|---|
static int | IP_MULTICAST_IF | 设置发送多播数据包的出接口。 |
static int | IP_MULTICAST_IF2 | 和上面一样。 |
static int | IP_MULTICAST_LOOP | 此选项启用或禁用多播数据报的本地环回。 |
static int | IP_TOS | 此选项设置 TCP 或 UDP 套接字的 IP 标头中的服务类型或流量类别字段。 |
static int | SO_BINDADDR | 获取套接字的本地地址绑定(此选项不能“设置”,只能“获取”,因为套接字是在创建时绑定的,因此不能更改本地绑定地址)。 |
static int | SO_BROADCAST | 为套接字设置 SO_BROADCAST。 |
static int | SO_KEEPALIVE | 如果为 TCP 套接字设置了 keepalive 选项,并且在 2 小时内没有通过套接字在任一方向上交换数据(注意:实际值取决于实现),TCP 会自动向对等方发送 keepalive 探测。 |
static int | SO_LINGER | 指定关闭时延迟超时。 |
static int | SO_OOBINLINE | 当设置 OOBINLINE 选项时,套接字上接收到的任何 TCP 紧急数据都将通过套接字输入流接收。 |
static int | SO_RCVBUF | 设置平台用于传入网络 I/O 的底层缓冲区大小的提示。 |
static int | SO_REUSEADDR | 为套接字设置 SO_REUSEADDR。 |
static int | SO_SNDBUF | 设置平台用于传出网络 I/O 的底层缓冲区大小的提示。 |
static int | SO_TIMEOUT | 设置阻塞 Socket 操作的超时时间: |
static int | TCP_NODELAY | 禁用此连接的 Nagle 算法。 |
方法总结
修饰符和类型 | 方法 | 描述 |
---|---|---|
Object | getOption(int optID) | 获取选项的值。 |
void | setOption(int optID, Object value) | 启用/禁用 optID 指定的选项。 |
字段详细信息
IP_MULTICAST_IF
static final int IP_MULTICAST_IF
设置发送多播数据包的出接口。 在具有多个网络接口的主机上很有用,其中应用程序希望使用系统默认值以外的方式。 获取/返回一个 InetAddress。
对多播有效:DatagramSocketImpl
IP_MULTICAST_IF2
static final int IP_MULTICAST_IF2
和上面一样。 引入此选项后,IP_MULTICAST_IF 的行为将保持与以前相同,而此新选项可以支持使用 IPv4 和 IPv6 地址设置传出接口。 注意:确保与此没有冲突
IP_MULTICAST_LOOP
static final int IP_MULTICAST_LOOP
此选项启用或禁用多播数据报的本地环回。 多播套接字默认启用此选项。
IP_TOS
static final int IP_TOS
此选项设置 TCP 或 UDP 套接字的 IP 标头中的服务类型或流量类别字段。
SO_BINDADDR
static final int SO_BINDADDR
获取套接字的本地地址绑定(此选项不能“设置”,只能“获取”,因为套接字是在创建时绑定的,因此不能更改本地绑定地址)。 套接字的默认本地地址是 INADDR_ANY,表示多宿主主机上的任何本地地址。 多宿主主机可以使用此选项仅接受到其地址之一的连接(在 ServerSocket 或 DatagramSocket 的情况下),或指定其到对等方的返回地址(对于 Socket 或 DatagramSocket)。 此选项的参数是 InetAddress。
此选项必须在构造函数中指定。
适用于:SocketImpl、DatagramSocketImpl
SO_BROADCAST
static final int SO_BROADCAST
为套接字设置 SO_BROADCAST。 此选项启用和禁用进程发送广播消息的能力。 它仅支持数据报套接字,并且仅在支持广播消息概念的网络(例如以太网、令牌环等)上受支持,并且默认为 DatagramSockets 设置。
SO_KEEPALIVE
static final int SO_KEEPALIVE
如果为 TCP 套接字设置了 keepalive 选项,并且在 2 小时内没有通过套接字在任一方向上交换数据(注意:实际值取决于实现),TCP 会自动向对等方发送 keepalive 探测。 此探测是对等方必须响应的 TCP 段。 期望三个响应之一: 1. 对等点以期望的 ACK 响应。 不通知应用程序(因为一切正常)。 TCP 将在另外 2 小时不活动后发送另一个探测。 2. 对端响应一个 RST,告诉本地 TCP 对端主机已经崩溃并重新启动。 插座已关闭。 3. 对端无响应。 插座已关闭。 此选项的目的是检测对等主机是否崩溃。 仅对 TCP 套接字有效:SocketImpl
SO_LINGER
static final int SO_LINGER
指定关闭时延迟超时。 此选项禁用/启用从 TCP 套接字的 close() 立即返回。 使用非零整数超时启用此选项意味着 close() 将阻止等待写入对等方的所有数据的传输和确认,此时套接字将正常关闭。 达到延迟超时后,套接字将通过 TCP RST 强制关闭。 启用超时为零的选项会立即强制关闭。 如果指定的超时值超过 65,535,它将减少到 65,535。
仅对 TCP 有效:SocketImpl
SO_OOBINLINE
static final int SO_OOBINLINE
当设置 OOBINLINE 选项时,套接字上接收到的任何 TCP 紧急数据都将通过套接字输入流接收。 当该选项被禁用(这是默认设置)时,紧急数据将被静默丢弃。
SO_RCVBUF
static final int SO_RCVBUF
设置平台用于传入网络 I/O 的底层缓冲区大小的提示。 当在 set 中使用时,这是应用程序向内核提出的关于用于通过套接字接收数据的缓冲区大小的建议。 在 get 中使用时,它必须返回平台在此套接字上接收数据时实际使用的缓冲区大小。 适用于所有套接字:SocketImpl、DatagramSocketImpl
SO_REUSEADDR
static final int SO_REUSEADDR
为套接字设置 SO_REUSEADDR。 这仅用于 java 中的 MulticastSockets,默认情况下为 MulticastSockets 设置。
适用于:DatagramSocketImpl
SO_SNDBUF
static final int SO_SNDBUF
设置平台用于传出网络 I/O 的底层缓冲区大小的提示。 当在 set 中使用时,这是应用程序向内核提出的关于用于通过套接字发送的数据的缓冲区大小的建议。 在 get 中使用时,这必须返回平台在此套接字上发送数据时实际使用的缓冲区大小。 适用于所有套接字:SocketImpl、DatagramSocketImpl
SO_TIMEOUT
static final int SO_TIMEOUT
设置阻塞 Socket 操作的超时时间:
ServerSocket.accept();
SocketInputStream.read();
DatagramSocket.receive();
必须在进入阻塞操作之前设置该选项才能生效。 如果超时到期并且操作将继续阻塞,则会引发 java.io.InterruptedIOException。 在这种情况下,Socket 没有关闭。
适用于所有套接字:SocketImpl、DatagramSocketImpl
TCP_NODELAY
static final int TCP_NODELAY
禁用此连接的 Nagle 算法。 写入网络的数据不会缓冲等待对先前写入数据的确认。
仅对 TCP 有效:SocketImpl。
方法详情
setOption
void setOption(int optID, Object value) throws SocketException
启用/禁用 optID 指定的选项。 如果要启用该选项,并且它需要一个特定于选项的“值”,则将其传入值。 值的实际类型是特定于选项的,传递不属于预期类型的内容是错误的:
SocketImpl s;
...
s.setOption(SO_LINGER, new Integer(10));
// OK - set SO_LINGER w/ timeout of 10 sec.
s.setOption(SO_LINGER, new Double(10));
// ERROR - expects java.lang.Integer
如果请求的选项是二进制的,则可以通过 java.lang.Boolean 使用此方法设置:
s.setOption(TCP_NODELAY, new Boolean(true));
// OK - enables TCP_NODELAY, a binary option
任何选项都可以使用此方法和布尔值(false)禁用:
s.setOption(TCP_NODELAY, new Boolean(false));
// OK - disables TCP_NODELAY
s.setOption(SO_LINGER, new Boolean(false));
// OK - disables SO_LINGER
对于具有 on 和 off 概念并且需要非布尔参数的选项,将其值设置为 Boolean(false) 以外的任何值都会隐式启用它。 如果选项无法识别、套接字已关闭或发生一些低级错误,则抛出 SocketException
参数:
参数名称 | 参数描述 |
---|---|
optID | 标识选项 |
value | 套接字选项的参数 |
Throws:
Throw名称 | Throw描述 |
---|---|
SocketException | 如果该选项无法识别,则套接字已关闭,或者发生了一些低级错误 |
getOption
Object getOption(int optID) throws SocketException
获取选项的值。 如果启用,二进制选项将返回 java.lang.Boolean(true),如果禁用,则返回 java.lang.Boolean(false),例如:
SocketImpl s;
...
Boolean noDelay = (Boolean)(s.getOption(TCP_NODELAY));
if (noDelay.booleanValue()) {
// true if TCP_NODELAY is enabled...
...
}
对于将特定类型作为参数的选项,getOption(int) 将返回参数的值,否则将返回 java.lang.Boolean(false):
Object o = s.getOption(SO_LINGER);
if (o instanceof Integer) {
System.out.print("Linger time is " + ((Integer)o).intValue());
} else {
// the true type of o is java.lang.Boolean(false);
}
参数:
参数名称 | 参数描述 |
---|---|
optID | 一个 int 标识要获取的选项 |
返回:
option的值
Throws:
Throw名称 | Throw描述 |
---|---|
SocketException | 如果套接字关闭 |
SocketException | 如果 optID 在协议栈中是未知的(包括 SocketImpl) |