模块 java.base
 java.net

类 Socket

java.lang.Object
java.net.Socket
所有已实现的接口:
Closeable , AutoCloseable
已知子类:
SSLSocket

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

套接字的实际工作由 SocketImpl 类的实例执行。

Socket 类定义了设置和获取多个套接字选项的便捷方法。此类还定义了 setOption getOption 方法来设置和查询套接字选项。 Socket 支持以下选项:

套接字选项
选项名称 Description
SO_SNDBUF 套接字发送缓冲区的大小
SO_RCVBUF 套接字接收缓冲区的大小
SO_KEEPALIVE 保持连接
SO_REUSEADDR 重复使用地址
SO_LINGER 如果存在数据则在关闭时停留(仅在阻塞模式下配置时)
TCP_NODELAY 禁用 Nagle 算法
还可以支持其他(特定于实现的)选项。
自从:
1.0
参见:
  • 构造方法详细信息

    • Socket

      public Socket()
      创建一个未连接的套接字。

      如果应用程序指定了客户端套接字实现工厂,则调用该工厂的 createSocketImpl 方法来创建实际的套接字实现。否则将创建系统默认套接字实现。

      自从:
      1.1
    • 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 - 一个 Proxy 对象,指定应使用哪种代理。
      抛出:
      IllegalArgumentException - 如果代理是无效类型或 null
      SecurityException - 如果存在安全管理器并且连接到代理的权限被拒绝。
      自从:
      1.5
      参见:
    • Socket

      protected Socket(SocketImpl  impl) throws SocketException
      使用用户指定的 SocketImpl 创建一个未连接的 Socket。
      参数:
      impl - 一个实例SocketImpl子类希望在 Socket 上使用。
      抛出:
      SocketException - 如果底层协议出现错误,例如 TCP 错误。
      SecurityException - 如果 impl 不为空并且设置了安全管理器并且其 checkPermission 方法不允许 NetPermission("setSocketImpl")
      自从:
      1.1
    • Socket

      public Socket(String  host, int port) throws UnknownHostException , IOException
      创建一个流套接字并将其连接到指定主机上的指定端口号。

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

      如果应用程序指定了客户端套接字实现工厂,则调用该工厂的 createSocketImpl 方法来创建实际的套接字实现。否则将创建系统默认套接字实现。

      如果有一个安全管理器,它的 checkConnect 方法将以主机地址和 port 作为参数调用。这可能会导致 SecurityException。

      参数:
      host - 主机名,或 null 环回地址。
      port - 端口号。
      抛出:
      UnknownHostException - 如果无法确定主机的 IP 地址。
      IOException - 如果在创建套接字时发生 I/O 错误。
      SecurityException - 如果安全管理器存在且其 checkConnect 方法不允许该操作。
      IllegalArgumentException - 如果端口参数超出有效端口值的指定范围,即介于 0 和 65535 之间(含)。
      参见:
    • Socket

      public Socket(InetAddress  address, int port) throws IOException
      创建流套接字并将其连接到指定 IP 地址的指定端口号。

      如果应用程序指定了客户端套接字实现工厂,则调用该工厂的 createSocketImpl 方法来创建实际的套接字实现。否则将创建系统默认套接字实现。

      如果有一个安全管理器,它的 checkConnect 方法将以主机地址和 port 作为参数调用。这可能会导致 SecurityException。

      参数:
      address - IP 地址。
      port - 端口号。
      抛出:
      IOException - 如果在创建套接字时发生 I/O 错误。
      SecurityException - 如果安全管理器存在且其 checkConnect 方法不允许该操作。
      IllegalArgumentException - 如果端口参数超出有效端口值的指定范围,即介于 0 和 65535 之间(含)。
      NullPointerException - 如果 address 为空。
      参见:
    • Socket

      public Socket(String  host, int port, InetAddress  localAddr, int localPort) throws IOException
      创建套接字并将其连接到指定远程端口上的指定远程主机。 Socket 还将 bind() 到提供的本地地址和端口。

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

      zero 的本地端口号将使系统在 bind 操作中选择一个空闲端口。

      如果有一个安全管理器,它的 checkConnect 方法将以主机地址和 port 作为参数调用。这可能会导致 SecurityException。

      参数:
      host - 远程主机的名称,或 null 作为环回地址。
      port - 远程端口
      localAddr - 套接字绑定到的本地地址,或 nullanyLocal 地址。
      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 - 套接字绑定到的本地地址,或 nullanyLocal 地址。
      localPort - 套接字绑定到的本地端口或 zero 用于系统选择的空闲端口。
      抛出:
      IOException - 如果在创建套接字时发生 I/O 错误。
      SecurityException - 如果安全管理器存在且其 checkConnect 方法不允许连接到目标,或者其 checkListen 方法不允许绑定到本地端口。
      IllegalArgumentException - 如果端口参数或 localPort 参数超出有效端口值的指定范围,即介于 0 和 65535 之间(含)。
      NullPointerException - 如果 address 为空。
      自从:
      1.1
      参见:
    • Socket

      @Deprecated public Socket(String  host, int port, boolean stream) throws IOException
      已弃用。
      使用 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

      @Deprecated public Socket(InetAddress  host, int port, boolean stream) throws IOException
      已弃用。
      使用 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

      public void connect(SocketAddress  endpoint) throws IOException
      将此套接字连接到服务。

      此方法在以下情况下是可中断的

      1. 插座是 联系SocketChannel 。在这种情况下,中断建立连接的线程将关闭底层通道并导致此方法抛出 ClosedByInterruptException 并设置中断状态。
      2. 套接字使用系统默认套接字实现和 虚拟线程PREVIEW 正在建立连接。在那种情况下,中断虚拟线程将导致它唤醒并关闭套接字。然后此方法将抛出 SocketException 并设置中断状态。
      参数:
      endpoint - SocketAddress
      抛出:
      IOException - 如果在连接过程中发生错误
      IllegalBlockingModeException - 如果这个套接字有一个关联的通道,并且通道处于非阻塞模式
      IllegalArgumentException - 如果端点为 null 或者是此套接字不支持的 SocketAddress 子类
      自从:
      1.4
    • connect

      public void connect(SocketAddress  endpoint, int timeout) throws IOException
      使用指定的超时值将此套接字连接到服务。零超时被解释为无限超时。然后连接将阻塞,直到建立或发生错误。

      此方法在以下情况下是可中断的

      1. 插座是 联系SocketChannel 。在这种情况下,中断建立连接的线程将关闭底层通道并导致此方法抛出 ClosedByInterruptException 并设置中断状态。
      2. 套接字使用系统默认套接字实现和 虚拟线程PREVIEW 正在建立连接。在那种情况下,中断虚拟线程将导致它唤醒并关闭套接字。然后此方法将抛出 SocketException 并设置中断状态。
      参数:
      endpoint - SocketAddress
      timeout - 要使用的超时值(以毫秒为单位)。
      抛出:
      IOException - 如果在连接过程中发生错误
      SocketTimeoutException - 如果连接前超时
      IllegalBlockingModeException - 如果这个套接字有一个关联的通道,并且通道处于非阻塞模式
      IllegalArgumentException - 如果端点为空或者是此套接字不支持的 SocketAddress 子类,或者如果 timeout 为负
      自从:
      1.4
    • bind

      public void bind(SocketAddress  bindpoint) throws IOException
      将套接字绑定到本地地址。

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

      参数:
      bindpoint - 要绑定到的 SocketAddress
      抛出:
      IOException - 如果绑定操作失败,或者套接字已经绑定。
      IllegalArgumentException - 如果绑定点是此套接字不支持的 SocketAddress 子类
      SecurityException - 如果安全管理器存在且其 checkListen 方法不允许绑定到本地端口。
      自从:
      1.4
      参见:
    • getInetAddress

      public InetAddress  getInetAddress()
      返回套接字连接到的地址。

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

      返回:
      此套接字连接到的远程 IP 地址,如果套接字未连接,则为 null
    • getLocalAddress

      public InetAddress  getLocalAddress()
      获取套接字绑定到的本地地址。

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

      返回:
      套接字绑定到的本地地址,如果安全管理器拒绝,则为环回地址,如果套接字已关闭或尚未绑定,则为通配符地址。
      自从:
      1.1
      参见:
    • getPort

      public int getPort()
      返回此套接字连接到的远程端口号。

      如果 socket 在 closed 之前被连接,那么这个方法将在 socket 关闭后继续返回连接的端口号。

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

      public int getLocalPort()
      返回此套接字绑定到的本地端口号。

      如果套接字在 closed 之前被绑定,则此方法将在套接字关闭后继续返回本地端口号。

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

      public SocketAddress  getRemoteSocketAddress()
      返回此套接字连接到的端点的地址,如果未连接则返回 null

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

      返回:
      一个 SocketAddress 代表这个套接字的远程端点,或者 null 如果它还没有连接。
      自从:
      1.4
      参见:
    • getLocalSocketAddress

      public SocketAddress  getLocalSocketAddress()
      返回此套接字绑定到的端点的地址。

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

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

      返回:
      一个 SocketAddress 表示这个套接字的本地端点,或者一个 SocketAddress 表示环回地址,如果被安全管理器拒绝,或者 null 如果套接字尚未绑定。
      自从:
      1.4
      参见:
    • getChannel

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

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

      返回:
      与此套接字关联的套接字通道,如果此套接字不是为通道创建的,则为 null
      自从:
      1.4
    • getInputStream

      public InputStream  getInputStream() throws IOException
      返回此套接字的输入流。

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

      在以下情况下从输入流读取是可中断的

      1. 插座是 联系SocketChannel 。在这种情况下,中断从输入流读取的线程将关闭底层通道并导致读取方法抛出 ClosedByInterruptException 并设置中断状态。
      2. 套接字使用系统默认套接字实现和 虚拟线程PREVIEW 正在从输入流中读取。在那种情况下,中断虚拟线程将导致它唤醒并关闭套接字。然后读取方法将抛出SocketException并设置中断状态。

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

      • 网络软件可能会丢弃由套接字缓冲的字节。未被网络软件丢弃的字节可以使用 read 读取。

      • 如果套接字上没有缓冲的字节,或者所有缓冲的字节都已被 read 消耗掉,那么所有对 read 的后续调用都将抛出 IOException

      • 如果套接字上没有缓冲的字节,并且套接字没有使用 close 关闭,那么 available 将返回 0

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

      返回:
      用于从此套接字读取字节的输入流。
      抛出:
      IOException - 如果在创建输入流时发生 I/O 错误,则关闭套接字,未连接套接字,或者已使用 shutdownInput() 关闭套接字输入
    • getOutputStream

      public OutputStream  getOutputStream() throws IOException
      返回此套接字的输出流。

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

      在以下情况下写入输出流是可中断的

      1. 插座是 联系SocketChannel 。在这种情况下,中断写入输出流的线程将关闭底层通道并导致 write 方法抛出 ClosedByInterruptException 并设置中断状态。
      2. 套接字使用系统默认套接字实现和 虚拟线程PREVIEW 正在写入输出流。在那种情况下,中断虚拟线程将导致它唤醒并关闭套接字。然后,write 方法将抛出 SocketException 并设置中断状态。

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

      返回:
      用于将字节写入此套接字的输出流。
      抛出:
      IOException - 如果在创建输出流时发生 I/O 错误或未连接套接字。
    • setTcpNoDelay

      public void setTcpNoDelay(boolean on) throws SocketException
      启用/禁用 TCP_NODELAY (禁用/启用 Nagle 算法)。
      参数:
      on - true 启用 TCP_NODELAY,false 禁用。
      抛出:
      SocketException - 如果底层协议出现错误,例如 TCP 错误。
      自从:
      1.1
      参见:
    • getTcpNoDelay

      public boolean getTcpNoDelay() throws SocketException
      测试 TCP_NODELAY 是否启用。
      返回:
      boolean 表示 TCP_NODELAY 是否启用。
      抛出:
      SocketException - 如果底层协议出现错误,例如 TCP 错误。
      自从:
      1.1
      参见:
    • setSoLinger

      public void setSoLinger(boolean on, int linger) throws SocketException
      以指定的延迟时间启用/禁用 SO_LINGER (以秒为单位)。最大超时值是特定于平台的。该设置仅影响套接字关闭。
      参数:
      on - 是否继续逗留。
      linger - 逗留多长时间,如果 on 为真。
      抛出:
      SocketException - 如果底层协议出现错误,例如 TCP 错误。
      IllegalArgumentException - 如果延迟值为负。
      自从:
      1.1
      参见:
    • getSoLinger

      public int getSoLinger() throws SocketException
      返回 SO_LINGER 的设置。 -1 返回意味着该选项被禁用。该设置仅影响套接字关闭。
      返回:
      SO_LINGER 的设置。
      抛出:
      SocketException - 如果底层协议出现错误,例如 TCP 错误。
      自从:
      1.1
      参见:
    • sendUrgentData

      public void sendUrgentData(int data) throws IOException
      在套接字上发送一个字节的紧急数据。要发送的字节是数据参数的最低八位。紧急字节在任何先前写入套接字 OutputStream 之后和任何未来写入 OutputStream 之前发送。
      参数:
      data - 要发送的数据字节
      抛出:
      IOException - 如果发送数据时出错。
      自从:
      1.4
    • setOOBInline

      public void setOOBInline(boolean on) throws SocketException
      启用/禁用 SO_OOBINLINE (接收 TCP 紧急数据)默认情况下,此选项被禁用,并且在套接字上接收到的 TCP 紧急数据将被静默丢弃。如果用户希望接收紧急数据,则必须启用此选项。启用后,紧急数据将与正常数据一起接收。

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

      参数:
      on - true 启用 SO_OOBINLINE false 禁用。
      抛出:
      SocketException - 如果底层协议出现错误,例如 TCP 错误。
      自从:
      1.4
      参见:
    • getOOBInline

      public boolean getOOBInline() throws SocketException
      测试 SO_OOBINLINE 是否启用。
      返回:
      boolean 指示是否启用 SO_OOBINLINE
      抛出:
      SocketException - 如果底层协议出现错误,例如 TCP 错误。
      自从:
      1.4
      参见:
    • setSoTimeout

      public void setSoTimeout(int timeout) throws SocketException
      使用指定的超时启用/禁用 SO_TIMEOUT ,以毫秒为单位。将此选项设置为正超时值后,与此套接字关联的 InputStream 上的 read() 调用将仅阻塞这段时间。如果超时到期,一个java.net.SocketTimeoutException被引发,尽管 Socket 仍然有效。零超时被解释为无限超时。选项必须在进入阻塞操作之前启用才能生效。
      参数:
      timeout - 指定的超时时间,以毫秒为单位。
      抛出:
      SocketException - 如果底层协议有错误,比如TCP错误
      IllegalArgumentException - 如果 timeout 为负
      自从:
      1.1
      参见:
    • getSoTimeout

      public int getSoTimeout() throws SocketException
      返回 SO_TIMEOUT 的设置。返回 0 意味着该选项被禁用(即无限超时)。
      返回:
      SO_TIMEOUT 的设置
      抛出:
      SocketException - 如果底层协议出现错误,例如 TCP 错误。
      自从:
      1.1
      参见:
    • setSendBufferSize

      public void setSendBufferSize(int size) throws SocketException
      SO_SNDBUF 选项设置为此 Socket 的指定值。 SO_SNDBUF 选项被平台的网络代码用作设置底层网络 I/O 缓冲区大小的提示。

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

      参数:
      size - 设置发送缓冲区大小的大小。该值必须大于 0。
      抛出:
      SocketException - 如果底层协议出现错误,例如 TCP 错误。
      IllegalArgumentException - 如果值为 0 或负数。
      自从:
      1.2
      参见:
    • getSendBufferSize

      public int getSendBufferSize() throws SocketException
      获取此 SocketSO_SNDBUF 选项的值,即平台用于在此 Socket 上输出的缓冲区大小。
      返回:
      SocketSO_SNDBUF 选项的值。
      抛出:
      SocketException - 如果底层协议出现错误,例如 TCP 错误。
      自从:
      1.2
      参见:
    • setReceiveBufferSize

      public void setReceiveBufferSize(int size) throws SocketException
      SO_RCVBUF 选项设置为此 Socket 的指定值。 SO_RCVBUF 选项被平台的网络代码用作设置底层网络 I/O 缓冲区大小的提示。

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

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

      SO_RCVBUF 的值还用于设置向远程对等点通告的 TCP 接收窗口。通常,窗口大小可以在连接套接字时随时修改。但是,如果需要大于 64K 的接收窗口,则必须请求套接字连接到远程对等点。有两种情况需要注意:

      1. 对于从 ServerSocket 接受的套接字,这必须在 ServerSocket 绑定到本地地址之前调用 ServerSocket.setReceiveBufferSize(int) 来完成。
      2. 对于客户端套接字,必须在将套接字连接到其远程对等点之前调用 setReceiveBufferSize()。
      参数:
      size - 设置接收缓冲区大小的大小。该值必须大于 0。
      抛出:
      IllegalArgumentException - 如果值为 0 或负数。
      SocketException - 如果底层协议出现错误,例如 TCP 错误。
      自从:
      1.2
      参见:
    • getReceiveBufferSize

      public int getReceiveBufferSize() throws SocketException
      获取此 SocketSO_RCVBUF 选项的值,即平台用于在此 Socket 上输入的缓冲区大小。
      返回:
      SocketSO_RCVBUF 选项的值。
      抛出:
      SocketException - 如果底层协议出现错误,例如 TCP 错误。
      自从:
      1.2
      参见:
    • setKeepAlive

      public void setKeepAlive(boolean on) throws SocketException
      启用/禁用 SO_KEEPALIVE
      参数:
      on - 是否打开套接字保持活动状态。
      抛出:
      SocketException - 如果底层协议出现错误,例如 TCP 错误。
      自从:
      1.3
      参见:
    • getKeepAlive

      public boolean getKeepAlive() throws SocketException
      测试 SO_KEEPALIVE 是否启用。
      返回:
      boolean 表示 SO_KEEPALIVE 是否启用。
      抛出:
      SocketException - 如果底层协议出现错误,例如 TCP 错误。
      自从:
      1.3
      参见:
    • setTrafficClass

      public void setTrafficClass(int tc) throws SocketException
      为从此套接字发送的数据包在 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)
      最后一个低位总是被忽略,因为它对应于 MBZ(必须为零)位。

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

      正如 RFC 1122 第 4.2.4.2 节所示,兼容的 TCP 实现应该(但不是必须)让应用程序在连接的生命周期内更改 TOS 字段。所以TCP连接建立后是否可以更改服务类型字段取决于底层平台的实现。应用程序不应假定它们可以在连接后更改 TOS 字段。

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

      参数:
      tc - 位集的 int 值。
      抛出:
      SocketException - 如果设置流量类别或服务类型时出错
      自从:
      1.4
      参见:
    • getTrafficClass

      public int getTrafficClass() throws SocketException
      获取从此套接字发送的数据包的 IP 标头中的流量类别或服务类型

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

      返回:
      已设置的流量类别或服务类型
      抛出:
      SocketException - 如果获取流量类别或服务类型值时出错。
      自从:
      1.4
      参见:
    • setReuseAddress

      public void setReuseAddress(boolean on) throws SocketException
      启用/禁用 SO_REUSEADDR 套接字选项。

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

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

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

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

      参数:
      on - 是否启用或禁用套接字选项
      抛出:
      SocketException - 如果启用或禁用 SO_REUSEADDR 套接字选项时发生错误,或者套接字已关闭。
      自从:
      1.4
      参见:
    • getReuseAddress

      public boolean getReuseAddress() throws SocketException
      测试 SO_REUSEADDR 是否启用。
      返回:
      boolean 指示是否启用 SO_REUSEADDR
      抛出:
      SocketException - 如果底层协议出现错误,例如 TCP 错误。
      自从:
      1.4
      参见:
    • close

      public void close() throws IOException
      关闭这个套接字。

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

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

      关闭这个套接字也会关闭套接字的 InputStream OutputStream

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

      指定者:
      close 在接口 AutoCloseable
      指定者:
      close 在接口 Closeable
      抛出:
      IOException - 如果在关闭此套接字时发生 I/O 错误。
      参见:
    • shutdownInput

      public void shutdownInput() throws IOException
      将此套接字的输入流置于“流的结尾”。发送到套接字输入流端的任何数据都会被确认,然后被静默丢弃。

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

      抛出:
      IOException - 如果在关闭此套接字时发生 I/O 错误。
      自从:
      1.3
      参见:
    • shutdownOutput

      public void shutdownOutput() throws IOException
      禁用此套接字的输出流。对于 TCP 套接字,任何先前写入的数据都将在 TCP 的正常连接终止序列之后发送。如果在套接字上调用 shutdownOutput() 后写入套接字输出流,则该流将抛出 IOException。
      抛出:
      IOException - 如果在关闭此套接字时发生 I/O 错误。
      自从:
      1.3
      参见:
    • toString

      public String  toString()
      将此套接字转换为 String
      重写:
      toString 在类 Object
      返回:
      此套接字的字符串表示形式。
    • 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

      public <T> Socket  setOption(SocketOption <T> name, T value) throws IOException
      设置套接字选项的值。
      类型参数:
      T - 套接字选项值的类型
      参数:
      name - 套接字选项
      value - 套接字选项的值。 null 的值可能对某些选项有效。
      返回:
      这个套接字
      抛出:
      UnsupportedOperationException - 如果套接字不支持该选项。
      IllegalArgumentException - 如果该值对选项无效。
      IOException - 如果发生 I/O 错误,或者套接字已关闭。
      NullPointerException - 如果名字是 null
      SecurityException - 如果设置了安全管理器并且套接字选项需要安全权限并且调用者没有所需的权限。 StandardSocketOptions 不需要任何安全许可。
      自从:
      9
    • getOption

      public <T> T getOption(SocketOption <T> name) throws IOException
      返回套接字选项的值。
      类型参数:
      T - 套接字选项值的类型
      参数:
      name - 套接字选项
      返回:
      套接字选项的值。
      抛出:
      UnsupportedOperationException - 如果套接字不支持该选项。
      IOException - 如果发生 I/O 错误,或者套接字已关闭。
      NullPointerException - 如果名字是 null
      SecurityException - 如果设置了安全管理器并且套接字选项需要安全权限并且调用者没有所需的权限。 StandardSocketOptions 不需要任何安全许可。
      自从:
      9
    • supportedOptions

      public Set <SocketOption <?>> supportedOptions()
      返回此套接字支持的一组套接字选项。即使套接字已关闭,此方法仍将继续返回选项集。
      返回:
      此套接字支持的一组套接字选项。如果无法创建套接字的 SocketImpl,则该集合可能为空。
      自从:
      9