- 所有已实现的接口:
Closeable,AutoCloseable
- 已知子类:
SSLSocket
套接字的实际工作由 SocketImpl 类的实例执行。
Socket 类定义了设置和获取多个套接字选项的便捷方法。此类还定义了 setOption 和 getOption 方法来设置和查询套接字选项。 Socket 支持以下选项:
还可以支持其他(特定于实现的)选项。
选项名称 Description SO_SNDBUF套接字发送缓冲区的大小 SO_RCVBUF套接字接收缓冲区的大小 SO_KEEPALIVE保持连接 SO_REUSEADDR重复使用地址 SO_LINGER如果存在数据则在关闭时停留(仅在阻塞模式下配置时) TCP_NODELAY禁用 Nagle 算法
- 自从:
- 1.0
- 参见:
-
构造方法总结
构造方法修饰符构造方法描述Socket()创建一个未连接的套接字。创建一个流套接字并将其连接到指定主机上的指定端口号。已弃用。使用 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) 创建套接字并将其连接到指定远程端口上的指定远程地址。创建一个未连接的套接字,指定代理的类型,如果有的话,无论任何其他设置都应该使用。protectedSocket(SocketImpl impl) 使用用户指定的 SocketImpl 创建一个未连接的 Socket。 -
方法总结
修饰符和类型方法描述voidbind(SocketAddress bindpoint) 将套接字绑定到本地地址。voidclose()关闭这个套接字。voidconnect(SocketAddress endpoint) 将此套接字连接到服务。voidconnect(SocketAddress endpoint, int timeout) 使用指定的超时值将此套接字连接到服务。返回与此套接字关联的唯一SocketChannel对象(如果有)。返回套接字连接到的地址。返回此套接字的输入流。boolean测试SO_KEEPALIVE是否启用。获取套接字绑定到的本地地址。int返回此套接字绑定到的本地端口号。返回此套接字绑定到的端点的地址。boolean测试SO_OOBINLINE是否启用。<T> TgetOption(SocketOption<T> name) 返回套接字选项的值。返回此套接字的输出流。intgetPort()返回此套接字连接到的远程端口号。int返回此套接字连接到的端点的地址,如果未连接则返回null。boolean测试SO_REUSEADDR是否启用。intint返回SO_LINGER的设置。int返回SO_TIMEOUT的设置。返回 0 意味着该选项被禁用(即无限超时)。boolean测试TCP_NODELAY是否启用。int获取从此套接字发送的数据包的 IP 标头中的流量类别或服务类型booleanisBound()返回套接字的绑定状态。booleanisClosed()返回套接字的关闭状态。boolean返回套接字的连接状态。boolean返回套接字连接的读取一半是否已关闭。boolean返回套接字连接的写一半是否已关闭。voidsendUrgentData(int data) 在套接字上发送一个字节的紧急数据。voidsetKeepAlive(boolean on) 启用/禁用SO_KEEPALIVE。voidsetOOBInline(boolean on) 启用/禁用SO_OOBINLINE(接收 TCP 紧急数据)默认情况下,此选项被禁用,并且在套接字上接收到的 TCP 紧急数据将被静默丢弃。<T> SocketsetOption(SocketOption<T> name, T value) 设置套接字选项的值。voidsetPerformancePreferences(int connectionTime, int latency, int bandwidth) 为此套接字设置性能首选项。voidsetReceiveBufferSize(int size) 将SO_RCVBUF选项设置为此Socket的指定值。voidsetReuseAddress(boolean on) 启用/禁用SO_REUSEADDR套接字选项。voidsetSendBufferSize(int size) 将SO_SNDBUF选项设置为此Socket的指定值。static void已弃用。直接使用SocketFactory和子类Socket。voidsetSoLinger(boolean on, int linger) 以指定的延迟时间启用/禁用SO_LINGER(以秒为单位)。voidsetSoTimeout(int timeout) 使用指定的超时启用/禁用SO_TIMEOUT,以毫秒为单位。voidsetTcpNoDelay(boolean on) 启用/禁用TCP_NODELAY(禁用/启用 Nagle 算法)。voidsetTrafficClass(int tc) 为从此套接字发送的数据包在 IP 标头中设置流量类别或服务类型八位字节。void将此套接字的输入流置于“流的结尾”。void禁用此套接字的输出流。Set<SocketOption<?>>返回此套接字支持的一组套接字选项。toString()将此套接字转换为String。
-
构造方法详细信息
-
Socket
public Socket()创建一个未连接的套接字。如果应用程序指定了客户端套接字实现工厂,则调用该工厂的
createSocketImpl方法来创建实际的套接字实现。否则将创建系统默认套接字实现。- 自从:
- 1.1
-
Socket
创建一个未连接的套接字,指定代理的类型,如果有的话,无论任何其他设置都应该使用。如果有安全管理器,它的
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- 一个Proxy对象,指定应使用哪种代理。- 抛出:
IllegalArgumentException- 如果代理是无效类型或null。SecurityException- 如果存在安全管理器并且连接到代理的权限被拒绝。- 自从:
- 1.5
- 参见:
-
Socket
使用用户指定的 SocketImpl 创建一个未连接的 Socket。- 参数:
impl- 一个实例SocketImpl子类希望在 Socket 上使用。- 抛出:
SocketException- 如果底层协议出现错误,例如 TCP 错误。SecurityException- 如果impl不为空并且设置了安全管理器并且其checkPermission方法不允许NetPermission("setSocketImpl")。- 自从:
- 1.1
-
Socket
创建一个流套接字并将其连接到指定主机上的指定端口号。如果指定的主机是
null,则相当于将地址指定为InetAddress.getByName(null)。也就是说,相当于指定了loopback接口的地址。如果应用程序指定了客户端套接字实现工厂,则调用该工厂的
createSocketImpl方法来创建实际的套接字实现。否则将创建系统默认套接字实现。如果有一个安全管理器,它的
checkConnect方法将以主机地址和port作为参数调用。这可能会导致 SecurityException。- 参数:
host- 主机名,或null环回地址。port- 端口号。- 抛出:
UnknownHostException- 如果无法确定主机的 IP 地址。IOException- 如果在创建套接字时发生 I/O 错误。SecurityException- 如果安全管理器存在且其checkConnect方法不允许该操作。IllegalArgumentException- 如果端口参数超出有效端口值的指定范围,即介于 0 和 65535 之间(含)。- 参见:
-
Socket
创建流套接字并将其连接到指定 IP 地址的指定端口号。如果应用程序指定了客户端套接字实现工厂,则调用该工厂的
createSocketImpl方法来创建实际的套接字实现。否则将创建系统默认套接字实现。如果有一个安全管理器,它的
checkConnect方法将以主机地址和port作为参数调用。这可能会导致 SecurityException。- 参数:
address- IP 地址。port- 端口号。- 抛出:
IOException- 如果在创建套接字时发生 I/O 错误。SecurityException- 如果安全管理器存在且其checkConnect方法不允许该操作。IllegalArgumentException- 如果端口参数超出有效端口值的指定范围,即介于 0 和 65535 之间(含)。NullPointerException- 如果address为空。- 参见:
-
Socket
创建套接字并将其连接到指定远程端口上的指定远程主机。 Socket 还将 bind() 到提供的本地地址和端口。如果指定的主机是
null,则相当于将地址指定为InetAddress.getByName(null)。也就是说,相当于指定了loopback接口的地址。zero的本地端口号将使系统在bind操作中选择一个空闲端口。如果有一个安全管理器,它的
checkConnect方法将以主机地址和port作为参数调用。这可能会导致 SecurityException。- 参数:
host- 远程主机的名称,或null作为环回地址。port- 远程端口localAddr- 套接字绑定到的本地地址,或null为anyLocal地址。localPort- 套接字绑定到的本地端口,或zero用于系统选择的空闲端口。- 抛出:
IOException- 如果在创建套接字时发生 I/O 错误。SecurityException- 如果安全管理器存在且其checkConnect方法不允许连接到目标,或者其checkListen方法不允许绑定到本地端口。IllegalArgumentException- 如果端口参数或 localPort 参数超出有效端口值的指定范围,即介于 0 和 65535 之间(含)。- 自从:
- 1.1
- 参见:
-
Socket
public Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException 创建套接字并将其连接到指定远程端口上的指定远程地址。 Socket 还将 bind() 到提供的本地地址和端口。如果指定的本地地址是
null,则相当于将地址指定为 AnyLocal 地址(请参阅InetAddress.isAnyLocalAddress())。zero的本地端口号将使系统在bind操作中选择一个空闲端口。如果有一个安全管理器,它的
checkConnect方法将以主机地址和port作为参数调用。这可能会导致 SecurityException。- 参数:
address- 远程地址port- 远程端口localAddr- 套接字绑定到的本地地址,或null为anyLocal地址。localPort- 套接字绑定到的本地端口或zero用于系统选择的空闲端口。- 抛出:
IOException- 如果在创建套接字时发生 I/O 错误。SecurityException- 如果安全管理器存在且其checkConnect方法不允许连接到目标,或者其checkListen方法不允许绑定到本地端口。IllegalArgumentException- 如果端口参数或 localPort 参数超出有效端口值的指定范围,即介于 0 和 65535 之间(含)。NullPointerException- 如果address为空。- 自从:
- 1.1
- 参见:
-
Socket
已弃用。使用 DatagramSocket 代替 UDP 传输。创建一个流套接字并将其连接到指定主机上的指定端口号。如果指定的主机是
null,则相当于将地址指定为InetAddress.getByName(null)。也就是说,相当于指定了loopback接口的地址。如果流参数是
true,这将创建一个流套接字。如果流参数是false,它会创建一个数据报套接字。如果应用程序指定了客户端套接字实现工厂,则调用该工厂的
createSocketImpl方法来创建实际的套接字实现。否则将创建系统默认套接字实现。如果有一个安全管理器,它的
checkConnect方法将以主机地址和port作为参数调用。这可能会导致 SecurityException。如果使用 UDP 套接字,则 TCP/IP 相关套接字选项将不适用。
- 参数:
host- 主机名,或null环回地址。port- 端口号。stream- 一个boolean指示这是流套接字还是数据报套接字。- 抛出:
IOException- 如果在创建套接字时发生 I/O 错误。SecurityException- 如果安全管理器存在且其checkConnect方法不允许该操作。IllegalArgumentException- 如果端口参数超出有效端口值的指定范围,即介于 0 和 65535 之间(含)。- 参见:
-
Socket
已弃用。使用 DatagramSocket 代替 UDP 传输。创建套接字并将其连接到指定 IP 地址的指定端口号。如果流参数是
true,这将创建一个流套接字。如果流参数是false,它会创建一个数据报套接字。如果应用程序指定了客户端套接字实现工厂,则调用该工厂的
createSocketImpl方法来创建实际的套接字实现。否则将创建系统默认套接字实现。如果有一个安全管理器,它的
checkConnect方法将以host.getHostAddress()和port作为参数调用。这可能会导致 SecurityException。如果使用 UDP 套接字,则 TCP/IP 相关套接字选项将不适用。
- 参数:
host- IP 地址。port- 端口号。stream- 如果是true,则创建一个流套接字;否则,创建数据报套接字。- 抛出:
IOException- 如果在创建套接字时发生 I/O 错误。SecurityException- 如果安全管理器存在且其checkConnect方法不允许该操作。IllegalArgumentException- 如果端口参数超出有效端口值的指定范围,即介于 0 和 65535 之间(含)。NullPointerException- 如果host为空。- 参见:
-
-
方法详情
-
connect
将此套接字连接到服务。此方法在以下情况下是可中断的:
- 插座是 联系 和
SocketChannel。在这种情况下,中断建立连接的线程将关闭底层通道并导致此方法抛出ClosedByInterruptException并设置中断状态。 - 套接字使用系统默认套接字实现和 虚拟线程PREVIEW 正在建立连接。在那种情况下,中断虚拟线程将导致它唤醒并关闭套接字。然后此方法将抛出
SocketException并设置中断状态。
- 参数:
endpoint-SocketAddress- 抛出:
IOException- 如果在连接过程中发生错误IllegalBlockingModeException- 如果这个套接字有一个关联的通道,并且通道处于非阻塞模式IllegalArgumentException- 如果端点为 null 或者是此套接字不支持的 SocketAddress 子类- 自从:
- 1.4
- 插座是 联系 和
-
connect
使用指定的超时值将此套接字连接到服务。零超时被解释为无限超时。然后连接将阻塞,直到建立或发生错误。此方法在以下情况下是可中断的:
- 插座是 联系 和
SocketChannel。在这种情况下,中断建立连接的线程将关闭底层通道并导致此方法抛出ClosedByInterruptException并设置中断状态。 - 套接字使用系统默认套接字实现和 虚拟线程PREVIEW 正在建立连接。在那种情况下,中断虚拟线程将导致它唤醒并关闭套接字。然后此方法将抛出
SocketException并设置中断状态。
- 参数:
endpoint-SocketAddresstimeout- 要使用的超时值(以毫秒为单位)。- 抛出:
IOException- 如果在连接过程中发生错误SocketTimeoutException- 如果连接前超时IllegalBlockingModeException- 如果这个套接字有一个关联的通道,并且通道处于非阻塞模式IllegalArgumentException- 如果端点为空或者是此套接字不支持的 SocketAddress 子类,或者如果timeout为负- 自从:
- 1.4
- 插座是 联系 和
-
bind
将套接字绑定到本地地址。如果地址是
null,那么系统将选择一个临时端口和一个有效的本地地址来绑定套接字。- 参数:
bindpoint- 要绑定到的SocketAddress- 抛出:
IOException- 如果绑定操作失败,或者套接字已经绑定。IllegalArgumentException- 如果绑定点是此套接字不支持的 SocketAddress 子类SecurityException- 如果安全管理器存在且其checkListen方法不允许绑定到本地端口。- 自从:
- 1.4
- 参见:
-
getInetAddress
返回套接字连接到的地址。如果套接字在
closed之前已连接,则此方法将在套接字关闭后继续返回已连接的地址。- 返回:
-
此套接字连接到的远程 IP 地址,如果套接字未连接,则为
null。
-
getLocalAddress
获取套接字绑定到的本地地址。如果设置了安全管理器,则以本地地址和
-1作为参数调用其checkConnect方法,以查看是否允许该操作。如果不允许操作,则返回loopback地址。- 返回:
- 套接字绑定到的本地地址,如果安全管理器拒绝,则为环回地址,如果套接字已关闭或尚未绑定,则为通配符地址。
- 自从:
- 1.1
- 参见:
-
getPort
public int getPort()返回此套接字连接到的远程端口号。如果 socket 在
closed之前被连接,那么这个方法将在 socket 关闭后继续返回连接的端口号。- 返回:
- 此套接字连接到的远程端口号,如果套接字尚未连接则为 0。
-
getLocalPort
public int getLocalPort()返回此套接字绑定到的本地端口号。如果套接字在
closed之前被绑定,则此方法将在套接字关闭后继续返回本地端口号。- 返回:
- 此套接字绑定到的本地端口号,如果套接字尚未绑定,则为 -1。
-
getRemoteSocketAddress
返回此套接字连接到的端点的地址,如果未连接则返回null。如果套接字在
closed之前已连接,则此方法将在套接字关闭后继续返回已连接的地址。- 返回:
-
一个
SocketAddress代表这个套接字的远程端点,或者null如果它还没有连接。 - 自从:
- 1.4
- 参见:
-
getLocalSocketAddress
返回此套接字绑定到的端点的地址。如果绑定到由
InetSocketAddress表示的端点的套接字是closed,则此方法将在套接字关闭后继续返回一个InetSocketAddress。在这种情况下,返回的InetSocketAddress的地址是wildcard地址,其端口是它绑定到的本地端口。如果设置了安全管理器,则以本地地址和
-1作为参数调用其checkConnect方法,以查看是否允许该操作。如果不允许该操作,则返回表示loopback地址和此套接字绑定到的本地端口的SocketAddress。- 返回:
-
一个
SocketAddress表示这个套接字的本地端点,或者一个SocketAddress表示环回地址,如果被安全管理器拒绝,或者null如果套接字尚未绑定。 - 自从:
- 1.4
- 参见:
-
getChannel
返回与此套接字关联的唯一SocketChannel对象(如果有)。当且仅当通道本身是通过
SocketChannel.open或ServerSocketChannel.accept方法创建的时,套接字才会有通道。- 返回:
-
与此套接字关联的套接字通道,如果此套接字不是为通道创建的,则为
null - 自从:
- 1.4
-
getInputStream
返回此套接字的输入流。如果此套接字具有关联的通道,则生成的输入流将其所有操作委托给该通道。如果通道处于非阻塞模式,则输入流的
read操作将抛出IllegalBlockingModeException。在以下情况下从输入流读取是可中断的:
- 插座是 联系 和
SocketChannel。在这种情况下,中断从输入流读取的线程将关闭底层通道并导致读取方法抛出ClosedByInterruptException并设置中断状态。 - 套接字使用系统默认套接字实现和 虚拟线程PREVIEW 正在从输入流中读取。在那种情况下,中断虚拟线程将导致它唤醒并关闭套接字。然后读取方法将抛出
SocketException并设置中断状态。
在异常情况下,底层连接可能会被远程主机或网络软件中断(例如 TCP 连接时的连接重置)。当网络软件检测到断开的连接时,以下内容适用于返回的输入流:-
网络软件可能会丢弃由套接字缓冲的字节。未被网络软件丢弃的字节可以使用
read读取。如果套接字上没有缓冲的字节,或者所有缓冲的字节都已被
read消耗掉,那么所有对read的后续调用都将抛出IOException。
关闭返回的
InputStream将关闭关联的套接字。- 返回:
- 用于从此套接字读取字节的输入流。
- 抛出:
IOException- 如果在创建输入流时发生 I/O 错误,则关闭套接字,未连接套接字,或者已使用shutdownInput()关闭套接字输入
- 插座是 联系 和
-
getOutputStream
返回此套接字的输出流。如果此套接字具有关联的通道,则生成的输出流将其所有操作委托给该通道。如果通道处于非阻塞模式,则输出流的
write操作将抛出IllegalBlockingModeException。在以下情况下写入输出流是可中断的:
- 插座是 联系 和
SocketChannel。在这种情况下,中断写入输出流的线程将关闭底层通道并导致 write 方法抛出ClosedByInterruptException并设置中断状态。 - 套接字使用系统默认套接字实现和 虚拟线程PREVIEW 正在写入输出流。在那种情况下,中断虚拟线程将导致它唤醒并关闭套接字。然后,write 方法将抛出
SocketException并设置中断状态。
关闭返回的
OutputStream将关闭关联的套接字。- 返回:
- 用于将字节写入此套接字的输出流。
- 抛出:
IOException- 如果在创建输出流时发生 I/O 错误或未连接套接字。
- 插座是 联系 和
-
setTcpNoDelay
启用/禁用TCP_NODELAY(禁用/启用 Nagle 算法)。- 参数:
on-true启用 TCP_NODELAY,false禁用。- 抛出:
SocketException- 如果底层协议出现错误,例如 TCP 错误。- 自从:
- 1.1
- 参见:
-
getTcpNoDelay
测试TCP_NODELAY是否启用。- 返回:
boolean表示TCP_NODELAY是否启用。- 抛出:
SocketException- 如果底层协议出现错误,例如 TCP 错误。- 自从:
- 1.1
- 参见:
-
setSoLinger
以指定的延迟时间启用/禁用SO_LINGER(以秒为单位)。最大超时值是特定于平台的。该设置仅影响套接字关闭。- 参数:
on- 是否继续逗留。linger- 逗留多长时间,如果 on 为真。- 抛出:
SocketException- 如果底层协议出现错误,例如 TCP 错误。IllegalArgumentException- 如果延迟值为负。- 自从:
- 1.1
- 参见:
-
getSoLinger
返回SO_LINGER的设置。 -1 返回意味着该选项被禁用。该设置仅影响套接字关闭。- 返回:
SO_LINGER的设置。- 抛出:
SocketException- 如果底层协议出现错误,例如 TCP 错误。- 自从:
- 1.1
- 参见:
-
sendUrgentData
在套接字上发送一个字节的紧急数据。要发送的字节是数据参数的最低八位。紧急字节在任何先前写入套接字 OutputStream 之后和任何未来写入 OutputStream 之前发送。- 参数:
data- 要发送的数据字节- 抛出:
IOException- 如果发送数据时出错。- 自从:
- 1.4
-
setOOBInline
启用/禁用SO_OOBINLINE(接收 TCP 紧急数据)默认情况下,此选项被禁用,并且在套接字上接收到的 TCP 紧急数据将被静默丢弃。如果用户希望接收紧急数据,则必须启用此选项。启用后,紧急数据将与正常数据一起接收。请注意,仅提供有限的支持来处理传入的紧急数据。特别是,不提供传入紧急数据的通知,并且除非由更高级别的协议提供,否则不具备区分正常数据和紧急数据的能力。
- 参数:
on-true启用SO_OOBINLINE,false禁用。- 抛出:
SocketException- 如果底层协议出现错误,例如 TCP 错误。- 自从:
- 1.4
- 参见:
-
getOOBInline
测试SO_OOBINLINE是否启用。- 返回:
boolean指示是否启用SO_OOBINLINE。- 抛出:
SocketException- 如果底层协议出现错误,例如 TCP 错误。- 自从:
- 1.4
- 参见:
-
setSoTimeout
使用指定的超时启用/禁用SO_TIMEOUT,以毫秒为单位。将此选项设置为正超时值后,与此套接字关联的 InputStream 上的 read() 调用将仅阻塞这段时间。如果超时到期,一个java.net.SocketTimeoutException被引发,尽管 Socket 仍然有效。零超时被解释为无限超时。选项必须在进入阻塞操作之前启用才能生效。- 参数:
timeout- 指定的超时时间,以毫秒为单位。- 抛出:
SocketException- 如果底层协议有错误,比如TCP错误IllegalArgumentException- 如果timeout为负- 自从:
- 1.1
- 参见:
-
getSoTimeout
返回SO_TIMEOUT的设置。返回 0 意味着该选项被禁用(即无限超时)。- 返回:
SO_TIMEOUT的设置- 抛出:
SocketException- 如果底层协议出现错误,例如 TCP 错误。- 自从:
- 1.1
- 参见:
-
setSendBufferSize
将SO_SNDBUF选项设置为此Socket的指定值。SO_SNDBUF选项被平台的网络代码用作设置底层网络 I/O 缓冲区大小的提示。因为
SO_SNDBUF是一个提示,所以想要验证缓冲区大小设置的应用程序应该调用getSendBufferSize()。- 参数:
size- 设置发送缓冲区大小的大小。该值必须大于 0。- 抛出:
SocketException- 如果底层协议出现错误,例如 TCP 错误。IllegalArgumentException- 如果值为 0 或负数。- 自从:
- 1.2
- 参见:
-
getSendBufferSize
- 返回:
-
此
Socket的SO_SNDBUF选项的值。 - 抛出:
SocketException- 如果底层协议出现错误,例如 TCP 错误。- 自从:
- 1.2
- 参见:
-
setReceiveBufferSize
将SO_RCVBUF选项设置为此Socket的指定值。SO_RCVBUF选项被平台的网络代码用作设置底层网络 I/O 缓冲区大小的提示。增加接收缓冲区大小可以提高大容量连接的网络 I/O 性能,而减小它可以帮助减少传入数据的积压。
因为
SO_RCVBUF是一个提示,所以想要验证缓冲区大小设置的应用程序应该调用getReceiveBufferSize()。SO_RCVBUF的值还用于设置向远程对等点通告的 TCP 接收窗口。通常,窗口大小可以在连接套接字时随时修改。但是,如果需要大于 64K 的接收窗口,则必须请求前套接字连接到远程对等点。有两种情况需要注意:- 对于从 ServerSocket 接受的套接字,这必须在 ServerSocket 绑定到本地地址之前调用
ServerSocket.setReceiveBufferSize(int)来完成。 - 对于客户端套接字,必须在将套接字连接到其远程对等点之前调用 setReceiveBufferSize()。
- 参数:
size- 设置接收缓冲区大小的大小。该值必须大于 0。- 抛出:
IllegalArgumentException- 如果值为 0 或负数。SocketException- 如果底层协议出现错误,例如 TCP 错误。- 自从:
- 1.2
- 参见:
- 对于从 ServerSocket 接受的套接字,这必须在 ServerSocket 绑定到本地地址之前调用
-
getReceiveBufferSize
- 返回:
-
此
Socket的SO_RCVBUF选项的值。 - 抛出:
SocketException- 如果底层协议出现错误,例如 TCP 错误。- 自从:
- 1.2
- 参见:
-
setKeepAlive
启用/禁用SO_KEEPALIVE。- 参数:
on- 是否打开套接字保持活动状态。- 抛出:
SocketException- 如果底层协议出现错误,例如 TCP 错误。- 自从:
- 1.3
- 参见:
-
getKeepAlive
测试SO_KEEPALIVE是否启用。- 返回:
boolean表示SO_KEEPALIVE是否启用。- 抛出:
SocketException- 如果底层协议出现错误,例如 TCP 错误。- 自从:
- 1.3
- 参见:
-
setTrafficClass
为从此套接字发送的数据包在 IP 标头中设置流量类别或服务类型八位字节。由于底层网络实现可能会忽略此值,应用程序应将其视为提示。TC必须在
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 协议 v6,
tc是将放入 IP 标头的 sin6_flowinfo 字段中的值。- 参数:
tc- 位集的int值。- 抛出:
SocketException- 如果设置流量类别或服务类型时出错- 自从:
- 1.4
- 参见:
-
getTrafficClass
获取从此套接字发送的数据包的 IP 标头中的流量类别或服务类型由于底层网络实现可能会忽略使用
setTrafficClass(int)设置的流量类别或服务类型,因此此方法可能会返回与之前在此套接字上使用setTrafficClass(int)方法设置的值不同的值。- 返回:
- 已设置的流量类别或服务类型
- 抛出:
SocketException- 如果获取流量类别或服务类型值时出错。- 自从:
- 1.4
- 参见:
-
setReuseAddress
启用/禁用SO_REUSEADDR套接字选项。当 TCP 连接关闭时,连接可能会在连接关闭后的一段时间内保持超时状态(通常称为
TIME_WAIT状态或2MSL等待状态)。对于使用众所周知的套接字地址或端口的应用程序,如果在超时状态下存在涉及套接字地址或端口的连接,则可能无法将套接字绑定到所需的SocketAddress。在使用
bind(SocketAddress)绑定套接字之前启用SO_REUSEADDR允许绑定套接字,即使先前的连接处于超时状态。创建
Socket时,禁用SO_REUSEADDR的初始设置。未定义套接字绑定后启用或禁用
SO_REUSEADDR时的行为(参见isBound())。- 参数:
on- 是否启用或禁用套接字选项- 抛出:
SocketException- 如果启用或禁用SO_REUSEADDR套接字选项时发生错误,或者套接字已关闭。- 自从:
- 1.4
- 参见:
-
getReuseAddress
测试SO_REUSEADDR是否启用。- 返回:
boolean指示是否启用SO_REUSEADDR。- 抛出:
SocketException- 如果底层协议出现错误,例如 TCP 错误。- 自从:
- 1.4
- 参见:
-
close
关闭这个套接字。当前在此套接字上的 I/O 操作中阻塞的任何线程都将抛出
SocketException。一旦套接字被关闭,它就不能用于进一步的网络使用(即不能重新连接或重新连接)。需要创建一个新套接字。
关闭这个套接字也会关闭套接字的
InputStream和OutputStream。如果此套接字有关联的通道,则该通道也会关闭。
- 指定者:
close在接口AutoCloseable中- 指定者:
close在接口Closeable中- 抛出:
IOException- 如果在关闭此套接字时发生 I/O 错误。- 参见:
-
shutdownInput
将此套接字的输入流置于“流的结尾”。发送到套接字输入流端的任何数据都会被确认,然后被静默丢弃。如果在套接字上调用此方法后从套接字输入流读取数据,则该流的
available方法将返回 0,其read方法将返回-1(流结束)。- 抛出:
IOException- 如果在关闭此套接字时发生 I/O 错误。- 自从:
- 1.3
- 参见:
-
shutdownOutput
禁用此套接字的输出流。对于 TCP 套接字,任何先前写入的数据都将在 TCP 的正常连接终止序列之后发送。如果在套接字上调用 shutdownOutput() 后写入套接字输出流,则该流将抛出 IOException。- 抛出:
IOException- 如果在关闭此套接字时发生 I/O 错误。- 自从:
- 1.3
- 参见:
-
toString
将此套接字转换为String。 -
isConnected
public boolean isConnected()返回套接字的连接状态。注意:关闭套接字不会清除其连接状态,这意味着如果在关闭之前已成功连接,此方法将为已关闭的套接字返回
true(请参阅isClosed())。- 返回:
- 如果套接字已成功连接到服务,则为真
- 自从:
- 1.4
-
isBound
public boolean isBound()返回套接字的绑定状态。注意:关闭套接字不会清除其绑定状态,这意味着如果在关闭之前已成功绑定,则此方法将为已关闭的套接字返回
true(请参阅isClosed())。- 返回:
- 如果套接字已成功绑定到地址,则为真
- 自从:
- 1.4
- 参见:
-
isClosed
public boolean isClosed()返回套接字的关闭状态。- 返回:
- 如果套接字已关闭,则为真
- 自从:
- 1.4
- 参见:
-
isInputShutdown
public boolean isInputShutdown()返回套接字连接的读取一半是否已关闭。- 返回:
- 如果套接字的输入已关闭,则为真
- 自从:
- 1.4
- 参见:
-
isOutputShutdown
public boolean isOutputShutdown()返回套接字连接的写一半是否已关闭。- 返回:
- 如果套接字的输出已关闭,则为真
- 自从:
- 1.4
- 参见:
-
setSocketImplFactory
@Deprecated (since ="17") public static void setSocketImplFactory(SocketImplFactory fac) throws IOException 已弃用。直接使用SocketFactory和子类Socket。
此方法在早期的 JDK 版本中提供了一种方法来替换Socket的系统范围实现。自 Java 1.4 以来,它已基本过时。如果需要,可以通过扩展Socket并使用以 执行 作为参数的 受保护的构造函数 创建Socket以使用自定义实现。为应用程序设置客户端套接字实现工厂。工厂只能指定一次。当应用程序创建新的客户端套接字时,将调用套接字实现工厂的
createSocketImpl方法来创建实际的套接字实现。将
null传递给方法是空操作,除非工厂已经设置。如果有安全管理器,此方法首先调用安全管理器的
checkSetFactory方法以确保允许操作。这可能会导致 SecurityException。- 参数:
fac- 所需的工厂。- 抛出:
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表示高带宽的相对重要性- 自从:
- 1.5
-
setOption
设置套接字选项的值。- 类型参数:
T- 套接字选项值的类型- 参数:
name- 套接字选项value- 套接字选项的值。null的值可能对某些选项有效。- 返回:
- 这个套接字
- 抛出:
UnsupportedOperationException- 如果套接字不支持该选项。IllegalArgumentException- 如果该值对选项无效。IOException- 如果发生 I/O 错误,或者套接字已关闭。NullPointerException- 如果名字是nullSecurityException- 如果设置了安全管理器并且套接字选项需要安全权限并且调用者没有所需的权限。StandardSocketOptions不需要任何安全许可。- 自从:
- 9
-
getOption
返回套接字选项的值。- 类型参数:
T- 套接字选项值的类型- 参数:
name- 套接字选项- 返回:
- 套接字选项的值。
- 抛出:
UnsupportedOperationException- 如果套接字不支持该选项。IOException- 如果发生 I/O 错误,或者套接字已关闭。NullPointerException- 如果名字是nullSecurityException- 如果设置了安全管理器并且套接字选项需要安全权限并且调用者没有所需的权限。StandardSocketOptions不需要任何安全许可。- 自从:
- 9
-
supportedOptions
返回此套接字支持的一组套接字选项。即使套接字已关闭,此方法仍将继续返回选项集。- 返回:
- 此套接字支持的一组套接字选项。如果无法创建套接字的 SocketImpl,则该集合可能为空。
- 自从:
- 9
-