阅读(719) (1)

鸿蒙OS Socket

2022-06-06 16:31:41 更新

Socket

java.lang.Object

|---java.net.Socket

public class Socket
extends Object
implements Closeable

此类实现客户端套接字(也称为“套接字”)。 套接字是两台机器之间通信的端点。

套接字的实际工作由 SocketImpl 类的实例执行。 应用程序通过更改创建套接字实现的套接字工厂,可以将自己配置为创建适合本地防火墙的套接字。

构造函数摘要

修饰符 构造函数 描述
Socket() 创建一个未连接的套接字,系统默认类型为 SocketImpl。
Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上的指定端口号。
Socket(String host, int port, boolean stream) 已弃用。 使用 DatagramSocket 代替 UDP 传输。
Socket(String host, int port, InetAddress localAddr, int localPort) 创建一个套接字并将其连接到指定远程端口上的指定远程主机。
Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
Socket(InetAddress host, int port, boolean stream) 已弃用。 使用 DatagramSocket 代替 UDP 传输。
Socket(InetAddress address, int port, InetAddress localAddr, int localPort) 创建一个套接字并将其连接到指定远程端口上的指定远程地址。
Socket(Proxy proxy) 创建一个未连接的套接字,指定代理的类型(如果有),无论任何其他设置如何,都应使用该类型。
protected Socket(SocketImpl impl) 使用用户指定的 SocketImpl 创建一个未连接的 Socket。

方法总结

修饰符和类型 方法 描述
void bind(SocketAddress bindpoint) 将套接字绑定到本地地址。
void close() 关闭此套接字。
void connect(SocketAddress endpoint) 将此套接字连接到服务器。
void connect(SocketAddress endpoint, int timeout) 将此套接字连接到具有指定超时值的服务器。
SocketChannel getChannel() 返回与此套接字关联的唯一 SocketChannel 对象(如果有)。
InetAddress getInetAddress() 返回套接字连接的地址。
InputStream getInputStream() 返回此套接字的输入流。
boolean getKeepAlive() 测试是否启用了 SocketOptions#SO_KEEPALIVE。
InetAddress getLocalAddress() 获取套接字绑定的本地地址。
int getLocalPort() 返回此套接字绑定到的本地端口号。
SocketAddress getLocalSocketAddress() 返回此套接字绑定到的端点的地址。
boolean getOOBInline() 测试是否启用了 SocketOptions#SO_OOBINLINE。
OutputStream getOutputStream() 返回此套接字的输出流。
int getPort() 返回此套接字连接到的远程端口号。
int getReceiveBufferSize() 获取此 Socket 的 SocketOptions#SO_RCVBUF 选项的值,即平台用于在此 Socket 上输入的缓冲区大小。
SocketAddress getRemoteSocketAddress() 返回此套接字连接到的端点的地址,如果未连接,则返回 null。
boolean getReuseAddress() 测试 SocketOptions#SO_REUSEADDR 是否启用。
int getSendBufferSize() 获取此 Socket 的 SocketOptions#SO_SNDBUF 选项的值,即平台用于在此 Socket 上输出的缓冲区大小。
int getSoLinger() 返回 SocketOptions#SO_LINGER 的设置。
int getSoTimeout() 返回 SocketOptions#SO_TIMEOUT 的设置。
boolean getTcpNoDelay() 测试是否启用了 SocketOptions#TCP_NODELAY。
int getTrafficClass() 获取从此 Socket 发送的数据包的 IP 标头中的流量类别或服务类型
boolean isBound() 返回套接字的绑定状态。
boolean isClosed() 返回套接字的关闭状态。
boolean isConnected() 返回套接字的连接状态。
boolean isInputShutdown() 返回套接字连接的读半部分是否关闭。
boolean isOutputShutdown() 返回套接字连接的写半部分是否关闭。
void sendUrgentData(int data) 在套接字上发送一个字节的紧急数据。
void setKeepAlive(boolean on) 启用/禁用 SocketOptions#SO_KEEPALIVE。
void setOOBInline(boolean on) 启用/禁用 SocketOptions#SO_OOBINLINE(接收 TCP 紧急数据) 默认情况下,禁用此选项,并且在套接字上接收到的 TCP 紧急数据被静默丢弃。
void setPerformancePreferences(int connectionTime, int latency, int bandwidth) 设置此套接字的性能首选项。
void setReceiveBufferSize(int size) 将 SocketOptions#SO_RCVBUF 选项设置为此 Socket 的指定值。
void setReuseAddress(boolean on) 启用/禁用 SocketOptions#SO_REUSEADDR 套接字选项。
void setSendBufferSize(int size) 将 SocketOptions#SO_SNDBUF 选项设置为此 Socket 的指定值。
static void setSocketImplFactory(SocketImplFactory fac) 为应用程序设置客户端套接字实现工厂。
void setSoLinger(boolean on, int linger) 使用指定的延迟时间(以秒为单位)启用/禁用 SocketOptions#SO_LINGER。
void setSoTimeout(int timeout) 使用指定的超时启用/禁用 SocketOptions#SO_TIMEOUT,以毫秒为单位。
void setTcpNoDelay(boolean on) 启用/禁用 SocketOptions#TCP_NODELAY(禁用/启用 Nagle 算法)。
void setTrafficClass(int tc) 为从此 Socket 发送的数据包设置 IP 标头中的流量类别或服务类型八位字节。
void shutdownInput() 将此套接字的输入流放在“流的末尾”。
void shutdownOutput() 禁用此套接字的输出流。
String toString() 将此套接字转换为字符串。
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

构造函数详细信息

Socket

public Socket()

创建一个未连接的套接字,系统默认类型为 SocketImpl。

Socket

public Socket(Proxy proxy)

创建一个未连接的套接字,指定代理的类型(如果有),无论任何其他设置如何,都应使用该类型。

如果存在安全管理器,则调用其 checkConnect 方法,并使用代理主机地址和端口号作为其参数。 这可能会导致 SecurityException。

例子:

  • Socket s = new Socket(Proxy.NO_PROXY); 将创建一个普通套接字,忽略任何其他代理配置。
  • Socket s = new Socket(new Proxy(Proxy.Type.SOCKS, new InetSocketAddress("socks.mydom.com", 1080))); 将创建一个通过指定的 SOCKS 代理服务器连接的套接字。

参数:

参数名称 参数描述
proxy 指定应使用哪种代理的代理对象。

Throws:

Throw名称 Throw描述
IllegalArgumentException 如果代理的类型无效或为空。
SecurityException 如果存在安全管理器并且拒绝连接到代理的权限。

Socket

protected Socket(SocketImpl impl) throws SocketException

使用用户指定的 SocketImpl 创建一个未连接的 Socket。

参数:

参数名称 参数描述
impl 子类希望在 Socket 上使用的 SocketImpl 的实例。

Throws:

Throw名称 Throw描述
SocketException 如果底层协议有错误,例如 TCP 错误。
SecurityException 如果 impl 不为 null 并且设置了安全管理器,并且其 checkPermission 方法不允许 NetPermission("setSocketImpl")。

Socket

public Socket(String host, int port) throws IOException, UnknownHostException

创建一个流套接字并将其连接到指定主机上的指定端口号。

如果指定的主机为空,则相当于将地址指定为 InetAddress.getByName(null)。 也就是说,相当于指定了loopback接口的地址。

如果应用程序指定了服务器套接字工厂,则调用该工厂的 createSocketImpl 方法来创建实际的套接字实现。 否则会创建一个“普通”套接字。

如果存在安全管理器,则调用其 checkConnect 方法,并使用主机地址和端口作为其参数。 这可能会导致 SecurityException。

参数:

参数名称 参数描述
host 主机名,或 null 用于环回地址。
port 端口号。

Throws:

Throw名称 Throw描述
UnknownHostException 如果无法确定主机的 IP 地址。
IOException 如果在创建套接字时发生 I/O 错误。
SecurityException 如果存在安全管理器并且其 checkConnect 方法不允许该操作。
IllegalArgumentException 如果端口参数超出指定的有效端口值范围,即介于 0 和 65535 之间(包括 0 和 65535)。

Socket

public Socket(InetAddress address, int port) throws IOException

创建一个流套接字并将其连接到指定 IP 地址的指定端口号。

如果应用程序指定了套接字工厂,则调用该工厂的 createSocketImpl 方法来创建实际的套接字实现。 否则会创建一个“普通”套接字。

如果存在安全管理器,则调用其 checkConnect 方法,并使用主机地址和端口作为其参数。 这可能会导致 SecurityException。

参数:

参数名称 参数描述
address IP 地址。
port 端口号。

Throws:

Throw名称 Throw描述
IOException 如果在创建套接字时发生 I/O 错误。
SecurityException 如果存在安全管理器并且其 checkConnect 方法不允许该操作。
IllegalArgumentException 如果端口参数超出指定的有效端口值范围,即介于 0 和 65535 之间(包括 0 和 65535)。
NullPointerException 如果地址为空。

Socket

public Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException

创建一个套接字并将其连接到指定远程端口上的指定远程主机。 Socket 还将 bind() 到提供的本地地址和端口。

如果指定的主机为空,则相当于将地址指定为 InetAddress.getByName(null)。 也就是说,相当于指定了loopback接口的地址。

本地端口号为零将使系统在绑定操作中选择一个空闲端口。

如果存在安全管理器,则调用其 checkConnect 方法,并使用主机地址和端口作为其参数。 这可能会导致 SecurityException。

参数:

参数名称 参数描述
host 远程主机的名称,或 null 为环回地址。
port 远程端口
localAddr 套接字绑定到的本地地址,或者对于 anyLocal 地址为 null。
localPort 套接字绑定到的本地端口,或者系统选择的空闲端口为零。

Throws:

Throw名称 Throw描述
IOException 如果在创建套接字时发生 I/O 错误。
SecurityException 如果安全管理器存在并且它的 checkConnect 方法不允许连接到目标,或者它的 checkListen 方法不允许绑定到本地端口。
IllegalArgumentException 如果 port 参数或 localPort 参数超出指定的有效端口值范围,即 0 到 65535 之间,包括 0 和 65535。

Socket

public Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException

创建一个套接字并将其连接到指定远程端口上的指定远程地址。 Socket 还将 bind() 到提供的本地地址和端口。

如果指定的本地地址为空,则相当于将该地址指定为 AnyLocal 地址(请参阅 InetAddress.isAnyLocalAddress())。

本地端口号为零将使系统在绑定操作中选择一个空闲端口。

如果存在安全管理器,则调用其 checkConnect 方法,并使用主机地址和端口作为其参数。 这可能会导致 SecurityException。

参数:

参数名称 参数描述
address 远程地址
port 远程端口
localAddr 套接字绑定到的本地地址,或者对于 anyLocal 地址为 null。
localPort 套接字绑定到的本地端口或系统选择的空闲端口为零。

Throws:

Throw名称 Throw描述
IOException 如果在创建套接字时发生 I/O 错误。
SecurityException 如果安全管理器存在并且它的 checkConnect 方法不允许连接到目标,或者它的 checkListen 方法不允许绑定到本地端口。
IllegalArgumentException 如果 port 参数或 localPort 参数超出指定的有效端口值范围,即 0 到 65535 之间,包括 0 和 65535。
NullPointerException 如果地址为空。

Socket

@Deprecated public Socket(String host, int port, boolean stream) throws IOException

已弃用。 使用 DatagramSocket 代替 UDP 传输。

创建一个流套接字并将其连接到指定主机上的指定端口号。

如果指定的主机为空,则相当于将地址指定为 InetAddress.getByName(null)。 也就是说,相当于指定了loopback接口的地址。

如果流参数为真,这将创建一个流套接字。 如果流参数为假,它会创建一个数据报套接字。

如果应用程序指定了服务器套接字工厂,则调用该工厂的 createSocketImpl 方法来创建实际的套接字实现。 否则会创建一个“普通”套接字。

如果存在安全管理器,则调用其 checkConnect 方法,并使用主机地址和端口作为其参数。 这可能会导致 SecurityException。

如果使用 UDP 套接字,则与 TCP/IP 相关的套接字选项将不适用。

参数:

参数名称 参数描述
host 主机名,或 null 用于环回地址。
port 端口号。
stream 一个布尔值,指示这是流套接字还是数据报套接字。

Throws:

Throw名称 Throw描述
IOException 如果在创建套接字时发生 I/O 错误。
SecurityException 如果存在安全管理器并且其 checkConnect 方法不允许该操作。
IllegalArgumentException 如果端口参数超出指定的有效端口值范围,即介于 0 和 65535 之间(包括 0 和 65535)。

Socket

@Deprecated public Socket(InetAddress host, int port, boolean stream) throws IOException

已弃用。 使用 DatagramSocket 代替 UDP 传输。

创建一个套接字并将其连接到指定 IP 地址的指定端口号。

如果流参数为真,这将创建一个流套接字。 如果流参数为假,它会创建一个数据报套接字。

如果应用程序指定了服务器套接字工厂,则调用该工厂的 createSocketImpl 方法来创建实际的套接字实现。 否则会创建一个“普通”套接字。

如果有安全管理器,则调用其 checkConnect 方法,并使用 host.getHostAddress() 和 port 作为其参数。 这可能会导致 SecurityException。

如果使用 UDP 套接字,则 TCP/IP 相关的套接字选项将不适用。

参数:

参数名称 参数描述
host IP 地址。
port 端口号。
stream 如果为true,则创建一个流套接字; 否则,创建一个数据报套接字。

Throws:

Throw名称 Throw描述
IOException 如果在创建套接字时发生 I/O 错误。
SecurityException 如果存在安全管理器并且其 checkConnect 方法不允许该操作。
IllegalArgumentException 如果端口参数超出指定的有效端口值范围,即介于 0 和 65535 之间(包括 0 和 65535)。
NullPointerException 如果主机为空。

方法详情

connect

public void connect(SocketAddress endpoint) throws IOException

将此套接字连接到服务器。

参数:

参数名称 参数描述
endpoint 套接字地址

Throws:

Throw名称 Throw描述
IOException 如果在连接过程中发生错误
IllegalBlockingModeException 如果此套接字具有关联的通道,并且该通道处于非阻塞模式
IllegalArgumentException 如果端点为 null 或者是此套接字不支持的 SocketAddress 子类

connect

public void connect(SocketAddress endpoint, int timeout) throws IOException

将此套接字连接到具有指定超时值的服务器。 超时为零被解释为无限超时。 然后连接将阻塞,直到建立或发生错误。

参数:

参数名称 参数描述
endpoint 套接字地址
timeout 以毫秒为单位使用的超时值。

Throws:

Throw名称 Throw描述
IOException 如果在连接过程中发生错误
SocketTimeoutException 如果超时在连接之前到期
IllegalBlockingModeException 如果此套接字具有关联的通道,并且该通道处于非阻塞模式
IllegalArgumentException 如果端点为 null 或者是此套接字不支持的 SocketAddress 子类

bind

public void bind(SocketAddress bindpoint) throws IOException

将套接字绑定到本地地址。

如果地址为空,那么系统将选择一个临时端口和一个有效的本地地址来绑定套接字。

参数:

参数名称 参数描述
bindpoint 要绑定到的 SocketAddress

Throws:

Throw名称 Throw描述
IOException 如果绑定操作失败,或者套接字已经绑定。
IllegalArgumentException 如果 bindpoint 是此套接字不支持的 SocketAddress 子类
SecurityException 如果存在安全管理器并且其 checkListen 方法不允许绑定到本地端口。

getInetAddress

public InetAddress getInetAddress()

返回套接字连接的地址。

如果套接字在关闭之前已连接,则此方法将在套接字关闭后继续返回已连接的地址。

返回:

此套接字连接到的远程 IP 地址,如果套接字未连接,则为 null。

getLocalAddress

public InetAddress getLocalAddress()

获取套接字绑定的本地地址。

如果设置了安全管理器,则使用本地地址和 -1 作为其参数调用其 checkConnect 方法,以查看是否允许该操作。 如果不允许该操作,则返回 InetAddress#getLoopbackAddress 地址。

返回:

套接字绑定的本地地址,如果安全管理器拒绝,则为环回地址,或者如果套接字已关闭或尚未绑定,则为通配符地址。

getPort

public int getPort()

返回此套接字连接到的远程端口号。

如果套接字在关闭之前已连接,则此方法将在套接字关闭后继续返回连接的端口号。

返回:

此套接字连接到的远程端口号,如果套接字尚未连接,则为 0。

getLocalPort

public int getLocalPort()

返回此套接字绑定到的本地端口号。

如果套接字在关闭之前已经绑定,那么该方法将在套接字关闭后继续返回本地端口号。

返回:

此套接字绑定到的本地端口号,如果尚未绑定套接字,则为 -1。

getRemoteSocketAddress

public SocketAddress getRemoteSocketAddress()

返回此套接字连接到的端点的地址,如果未连接,则返回 null。

如果套接字在关闭之前已连接,则此方法将在套接字关闭后继续返回已连接的地址。

返回:

表示此套接字的远程端点的 SocketAddress,如果尚未连接,则为 null。

getLocalSocketAddress

public SocketAddress getLocalSocketAddress()

返回此套接字绑定到的端点的地址。

如果绑定到由 InetSocketAddress 表示的端点的套接字关闭,则此方法将在套接字关闭后继续返回 InetSocketAddress。 在这种情况下,返回的 InetSocketAddress 的地址是 InetAddress#isAnyLocalAddress 地址,它的端口是它绑定到的本地端口。

如果设置了安全管理器,则使用本地地址和 -1 作为其参数调用其 checkConnect 方法,以查看是否允许该操作。 如果不允许该操作,则返回表示 InetAddress#getLoopbackAddress 地址和此套接字绑定的本地端口的 SocketAddress。

返回:

表示此套接字的本地端点的 SocketAddress,如果被安全管理器拒绝,则表示环回地址的 SocketAddress,如果尚未绑定套接字,则为 null。

getChannel

public SocketChannel getChannel()

返回与此套接字关联的唯一 SocketChannel 对象(如果有)。

当且仅当通道本身是通过 SocketChannel.open 或 ServerSocketChannel.accept 方法创建时,套接字才会有通道。

返回:

与此套接字关联的套接字通道,如果此套接字不是为通道创建的,则为 null

getInputStream

public InputStream getInputStream() throws IOException

返回此套接字的输入流。

如果此套接字具有关联的通道,则生成的输入流将其所有操作委托给通道。如果通道处于非阻塞模式,则输入流的读取操作将抛出 IllegalBlockingModeException。

在异常情况下,底层连接可能会被远程主机或网络软件中断(例如 TCP 连接情况下的连接重置)。当网络软件检测到断开的连接时,以下内容适用于返回的输入流:-

  • 网络软件可能会丢弃由套接字缓冲的字节。没有被网络软件丢弃的字节可以使用 read 来读取。
  • 如果套接字上没有缓冲的字节,或者所有缓冲的字节都已被读取消耗,那么所有后续的读取调用都将抛出 IOException。
  • 如果套接字上没有缓冲字节,并且套接字没有使用 close 关闭,则 available 将返回 0。

关闭返回的 InputStream 将关闭关联的套接字。

返回:

用于从此套接字读取字节的输入流。

Throws:

Throw名称 Throw描述
IOException 如果在创建输入流时发生 I/O 错误、套接字已关闭、套接字未连接或套接字输入已使用 shutdownInput() 关闭

getOutputStream

public OutputStream getOutputStream() throws IOException

返回此套接字的输出流。

如果此套接字具有关联的通道,则生成的输出流将其所有操作委托给通道。 如果通道处于非阻塞模式,则输出流的写入操作将引发 IllegalBlockingModeException。

关闭返回的 OutputStream 将关闭关联的套接字。

返回:

用于将字节写入此套接字的输出流。

Throws:

Throw名称 Throw描述
IOException 如果在创建输出流时发生 I/O 错误或套接字未连接。

setTcpNoDelay

public void setTcpNoDelay(boolean on) throws SocketException

启用/禁用 SocketOptions#TCP_NODELAY(禁用/启用 Nagle 算法)。

参数:

参数名称 参数描述
on true 启用 TCP_NODELAY,false 禁用。

Throws:

Throw名称 Throw描述
SocketException 如果底层协议有错误,例如 TCP 错误。

getTcpNoDelay

public boolean getTcpNoDelay() throws SocketException

测试是否启用了 SocketOptions#TCP_NODELAY。

返回:

一个布尔值,指示是否启用 SocketOptions#TCP_NODELAY。

Throws:

Throw名称 Throw描述
SocketException 如果底层协议有错误,例如 TCP 错误。

setSoLinger

public void setSoLinger(boolean on, int linger) throws SocketException

使用指定的延迟时间(以秒为单位)启用/禁用 SocketOptions#SO_LINGER。 最大超时值是特定于平台的。 该设置仅影响套接字关闭。

参数:

参数名称 参数描述
on 是否留恋。
linger 如果 on 为true,要逗留多久。

Throws:

Throw名称 Throw描述
SocketException 如果底层协议有错误,例如 TCP 错误。
IllegalArgumentException 如果延迟值为负。

getSoLinger

public int getSoLinger() throws SocketException

返回 SocketOptions#SO_LINGER 的设置。 -1 返回意味着该选项被禁用。 该设置仅影响套接字关闭。

返回:

SocketOptions#SO_LINGER 的设置。

Throws:

Throw名称 Throw描述
SocketException 如果底层协议有错误,例如 TCP 错误。

sendUrgentData

public void sendUrgentData(int data) throws IOException

在套接字上发送一个字节的紧急数据。 要发送的字节是数据参数的最低八位。 紧急字节在任何先前写入套接字 OutputStream 之后和任何未来写入 OutputStream 之前发送。

参数:

参数名称 参数描述
data 要发送的数据字节

Throws:

Throw名称 Throw描述
IOException 如果发送数据时出错。

setOOBInline

public void setOOBInline(boolean on) throws SocketException

启用/禁用 SocketOptions#SO_OOBINLINE(接收 TCP 紧急数据) 默认情况下,禁用此选项,并且在套接字上接收到的 TCP 紧急数据被静默丢弃。 如果用户希望接收紧急数据,则必须启用此选项。 启用后,紧急数据将与普通数据一起接收。

请注意,仅提供有限的支持来处理传入的紧急数据。 特别是,不提供传入紧急数据的通知,并且没有能力区分正常数据和紧急数据,除非由更高级别的协议提供。

参数:

参数名称 参数描述
on true 启用 SocketOptions#SO_OOBINLINE, false 禁用。

Throws:

Throw名称 Throw描述
SocketException 如果底层协议有错误,例如 TCP 错误。

getOOBInline

public boolean getOOBInline() throws SocketException

测试是否启用了 SocketOptions#SO_OOBINLINE。

返回:

一个布尔值,指示是否启用 SocketOptions#SO_OOBINLINE。

Throws:

Throw名称 Throw描述
SocketException 如果底层协议有错误,例如 TCP 错误。

setSoTimeout

public void setSoTimeout(int timeout) throws SocketException

使用指定的超时启用/禁用 SocketOptions#SO_TIMEOUT,以毫秒为单位。 将此选项设置为非零超时,对与此 Socket 关联的 InputStream 的 read() 调用将仅阻塞此时间量。 如果超时到期,则会引发 java.net.SocketTimeoutException,尽管 Socket 仍然有效。 必须在进入阻塞操作之前启用该选项才能生效。 超时必须 > 0。超时为零被解释为无限超时。

参数:

参数名称 参数描述
timeout 指定的超时时间,以毫秒为单位。

Throws:

Throw名称 Throw描述
SocketException 如果底层协议有错误,例如 TCP 错误。

getSoTimeout

public int getSoTimeout() throws SocketException

返回 SocketOptions#SO_TIMEOUT 的设置。 返回 0 表示该选项被禁用(即无限超时)。

返回:

SocketOptions#SO_TIMEOUT 的设置

Throws:

Throw名称 Throw描述
SocketException 如果底层协议有错误,例如 TCP 错误。

setSendBufferSize

public void setSendBufferSize(int size) throws SocketException

将 SocketOptions#SO_SNDBUF 选项设置为此 Socket 的指定值。 SocketOptions#SO_SNDBUF 选项被平台的网络代码用作设置底层网络 I/O 缓冲区大小的提示。

因为 SocketOptions#SO_SNDBUF 是一个提示,所以想要验证缓冲区设置为多大大小的应用程序应该调用 getSendBufferSize()。

参数:

参数名称 参数描述
size 设置发送缓冲区大小的大小。 该值必须大于 0。

Throws:

Throw名称 Throw描述
SocketException 如果底层协议有错误,例如 TCP 错误。
IllegalArgumentException 如果值为 0 或为负数。

getSendBufferSize

public int getSendBufferSize() throws SocketException

获取此 Socket 的 SocketOptions#SO_SNDBUF 选项的值,即平台用于在此 Socket 上输出的缓冲区大小。

返回:

此 Socket 的 SocketOptions#SO_SNDBUF 选项的值。

Throws:

Throw名称 Throw描述
SocketException 如果底层协议有错误,例如 TCP 错误。

setReceiveBufferSize

public void setReceiveBufferSize(int size) throws SocketException

将 SocketOptions#SO_RCVBUF 选项设置为此 Socket 的指定值。 SocketOptions#SO_RCVBUF 选项被平台的网络代码用作设置底层网络 I/O 缓冲区大小的提示。

增加接收缓冲区大小可以提高大容量连接的网络 I/O 性能,而减小它可以帮助减少传入数据的积压。

因为 SocketOptions#SO_RCVBUF 是一个提示,所以想要验证缓冲区设置为多大大小的应用程序应该调用 getReceiveBufferSize()。

SocketOptions#SO_RCVBUF 的值也用于设置通告给远程对等方的 TCP 接收窗口。一般情况下,只要连接了套接字,就可以随时修改窗口大小。但是,如果需要大于 64K 的接收窗口,则必须在套接字连接到远程对等点之前请求。有两种情况需要注意:

  1. 对于从 ServerSocket 接受的套接字,这必须通过在 ServerSocket 绑定到本地地址之前调用 ServerSocket#setReceiveBufferSize(int) 来完成。
  2. 对于客户端套接字,setReceiveBufferSize() 必须在将套接字连接到其远程对等方之前调用。

参数:

参数名称 参数描述
size 设置接收缓冲区大小的大小。 该值必须大于 0。

Throws:

Throw名称 Throw描述
IllegalArgumentException 如果值为 0 或为负数。
SocketException 如果底层协议有错误,例如 TCP 错误。

getReceiveBufferSize

public int getReceiveBufferSize() throws SocketException

获取此 Socket 的 SocketOptions#SO_RCVBUF 选项的值,即平台用于在此 Socket 上输入的缓冲区大小。

返回:

此 Socket 的 SocketOptions#SO_RCVBUF 选项的值。

Throws:

Throw名称 Throw描述
SocketException 如果底层协议有错误,例如 TCP 错误。

setKeepAlive

public void setKeepAlive(boolean on) throws SocketException

启用/禁用 SocketOptions#SO_KEEPALIVE。

参数:

参数名称 参数描述
on 是否开启socket keep alive。

Throws:

Throw名称 Throw描述
SocketException 如果底层协议有错误,例如 TCP 错误。

getKeepAlive

public boolean getKeepAlive() throws SocketException

测试是否启用了 SocketOptions#SO_KEEPALIVE。

返回:

一个布尔值,指示是否启用 SocketOptions#SO_KEEPALIVE。

Throws:

Throw名称 Throw描述
SocketException 如果底层协议有错误,例如 TCP 错误。

setTrafficClass

public void setTrafficClass(int tc) throws SocketException

为从此 Socket 发送的数据包设置 IP 标头中的流量类别或服务类型八位字节。由于底层网络实现可能会忽略此值,因此应用程序应将其视为提示。

tc 必须在 0 <= tc <= 255 范围内,否则将抛出 IllegalArgumentException。

笔记:

对于 Internet 协议 v4,该值由一个整数组成,其中最低有效 8 位表示套接字发送的 IP 数据包中 TOS 八位字节的值。 RFC 1349 定义 TOS 值如下:

  • IPTOS_LOWCOST (0x02)
  • IPTOS_RELIABILITY (0x04)
  • IPTOS_THROUGHPUT (0x08)
  • IPTOS_LOWDELAY (0x10)

最后一个低位总是被忽略,因为它对应于 MBZ(必须为零)位。

设置优先级字段中的位可能会导致 SocketException 指示不允许该操作。

正如 RFC 1122 第 4.2.4.2 节所示,兼容的 TCP 实现应该但不是必须让应用程序在连接的生命周期内更改 TOS 字段。所以在TCP连接建立后是否可以改变type-of-service字段取决于底层平台的实现。应用程序不应假设他们可以在连接后更改 TOS 字段。

对于 Internet 协议 v6,tc 是放置在 IP 标头的 sin6_flowinfo 字段中的值。

参数:

参数名称 参数描述
tc 位集的 int 值。

Throws:

Throw名称 Throw描述
SocketException 如果设置流量类别或服务类型时出错

getTrafficClass

public int getTrafficClass() throws SocketException

获取从此 Socket 发送的数据包的 IP 标头中的流量类别或服务类型

由于底层网络实现可能会忽略使用 setTrafficClass(int) 设置的流量类或服务类型,因此此方法可能返回与之前在此 Socket 上使用 setTrafficClass(int) 方法设置的值不同的值。

返回:

已设置的流量类别或服务类型

Throws:

Throw名称 Throw描述
SocketException 如果获取流量类别或服务类型值时出错。

setReuseAddress

public void setReuseAddress(boolean on) throws SocketException

启用/禁用 SocketOptions#SO_REUSEADDR 套接字选项。

当 TCP 连接关闭时,连接可能会在连接关闭后的一段时间内保持超时状态(通常称为 TIME_WAIT 状态或 2MSL 等待状态)。 对于使用众所周知的套接字地址或端口的应用程序,如果存在涉及套接字地址或端口的处于超时状态的连接,则可能无法将套接字绑定到所需的 SocketAddress。

在使用 bind(java.net.SocketAddress) 绑定套接字之前启用 SocketOptions#SO_REUSEADDR 允许绑定套接字,即使先前的连接处于超时状态。

创建 Socket 时,SocketOptions#SO_REUSEADDR 的初始设置被禁用。

未定义套接字绑定后启用或禁用 SocketOptions#SO_REUSEADDR 时的行为(参见 isBound())。

参数:

参数名称 参数描述
on 是否启用或禁用套接字选项

Throws:

Throw名称 Throw描述
SocketException 如果启用或禁用 SocketOptions#SO_REUSEADDR 套接字选项发生错误,或者套接字已关闭。

getReuseAddress

public boolean getReuseAddress() throws SocketException

测试 SocketOptions#SO_REUSEADDR 是否启用。

返回:

一个布尔值,指示是否启用 SocketOptions#SO_REUSEADDR。

Throws:

Throw名称 Throw描述
SocketException 如果底层协议有错误,例如 TCP 错误。

close

public void close() throws IOException

关闭此套接字。

当前在此套接字上的 I/O 操作中阻塞的任何线程都将抛出 SocketException。

一旦套接字关闭,它就不能用于进一步的网络使用(即不能重新连接或重新连接)。 需要创建一个新的套接字。

关闭此套接字也会关闭套接字的 InputStream 和 OutputStream。

如果此套接字具有关联的通道,则该通道也将关闭。

指定者:

在接口 AutoCloseable 中关闭

指定者:

在接口Closeable中关闭

Throws:

Throw名称 Throw描述
IOException 如果关闭此套接字时发生 I/O 错误。

shutdownInput

public void shutdownInput() throws IOException

将此套接字的输入流放在“流的末尾”。 任何发送到套接字输入流端的数据都会被确认,然后被静默丢弃。

如果在套接字上调用此方法后从套接字输入流中读取,则流的可用方法将返回 0,其读取方法将返回 -1(流结束)。

Throws:

Throw名称 Throw描述
IOException 如果关闭此套接字时发生 I/O 错误。

shutdownOutput

public void shutdownOutput() throws IOException

禁用此套接字的输出流。 对于 TCP 套接字,任何先前写入的数据都将按照 TCP 的正常连接终止顺序发送。 如果在套接字上调用 shutdownOutput() 后写入套接字输出流,则该流将引发 IOException。

Throws:

Throw名称 Throw描述
IOException 如果关闭此套接字时发生 I/O 错误。

toString

public String toString()

将此套接字转换为字符串。

覆盖:

类 Object 中的 toString

返回:

此套接字的字符串表示形式。

isConnected

public boolean isConnected()

返回套接字的连接状态。

注意:关闭套接字不会清除其连接状态,这意味着如果在关闭之前成功连接,则此方法将为已关闭的套接字返回 true。

返回:

如果套接字成功连接到服务器,则为 true

isBound

public boolean isBound()

返回套接字的绑定状态。

注意:关闭套接字不会清除其绑定状态,这意味着如果在关闭之前成功绑定,则此方法将为已关闭的套接字返回 true。

返回:

如果套接字成功绑定到地址,则为 true

isClosed

public boolean isClosed()

返回套接字的关闭状态。

返回:

如果套接字已关闭,则为 true

isInputShutdown

public boolean isInputShutdown()

返回套接字连接的读半部分是否关闭。

返回:

如果套接字的输入已关闭,则为 true

isOutputShutdown

public boolean isOutputShutdown()

返回套接字连接的写半部分是否关闭。

返回:

如果套接字的输出已关闭,则为 true

setSocketImplFactory

public static void setSocketImplFactory(SocketImplFactory fac) throws IOException

为应用程序设置客户端套接字实现工厂。 工厂只能指定一次。

当应用程序创建新的客户端套接字时,会调用套接字实现工厂的 createSocketImpl 方法来创建实际的套接字实现。

除非已经设置了工厂,否则将 null 传递给方法是无操作的。

如果有安全管理器,该方法首先调用安全管理器的 checkSetFactory 方法,确保操作被允许。 这可能会导致 SecurityException。

参数:

参数名称 参数描述
fac 想要的工厂。

Throws:

Throw名称 Throw描述
IOException 如果设置套接字工厂时发生 I/O 错误。
SocketException 如果工厂已经定义。
SecurityException 如果存在安全管理器并且其 checkSetFactory 方法不允许该操作。

setPerformancePreferences

public void setPerformancePreferences(int connectionTime, int latency, int bandwidth)

设置此套接字的性能首选项。

套接字默认使用 TCP/IP 协议。一些实现可能会提供与 TCP/IP 具有不同性能特征的替代协议。此方法允许应用程序表达自己的偏好,即当实现从可用协议中进行选择时应如何进行这些权衡。

性能偏好由三个整数描述,其值表示短连接时间、低延迟和高带宽的相对重要性。整数的绝对值无关紧要;为了选择一个协议,这些值被简单地比较,较大的值表示更强的偏好。负值表示比正值低的优先级。例如,如果应用程序更喜欢短连接时间而不是低延迟和高带宽,那么它可以使用值 (1, 0, 0) 调用此方法。如果应用程序更喜欢高带宽而不是低延迟,以及低延迟而不是短连接时间,那么它可以使用值 (0, 1, 2) 调用此方法。

在此套接字连接后调用此方法将无效。

参数:

参数名称 参数描述
connectionTime 表示短连接时间的相对重要性的 int
latency 一个表示低延迟相对重要性的 int
bandwidth 表示高带宽相对重要性的 int