Module java.base
Package java.net

Class Socket

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

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

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

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

套接字选项
选项名称 描述
SO_SNDBUF 套接字发送缓冲区的大小
SO_RCVBUF 套接字接收缓冲区的大小
SO_KEEPALIVE 保持连接活动
SO_REUSEADDR 重新使用地址
SO_LINGER 在关闭时保持悬而未决(仅在阻塞模式下配置时存在数据时)
TCP_NODELAY 禁用Nagle算法
还可以支持其他(特定于实现的)选项。
自版本:
1.0
参见:
  • Constructor Details

    • 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的未连接的套接字。
      参数:
      impl - 一个SocketImpl的实例,子类希望在Socket上使用。
      抛出:
      SocketException - 如果底层协议中存在错误,比如TCP错误。
      SecurityException - 如果impl不为null,并且设置了安全管理器,其checkPermission方法不允许NetPermission("setSocketImpl")
      自从:
      1.1
    • Socket

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

      如果指定的主机为null,则相当于将地址指定为InetAddress.getByName(null)。换句话说,相当于指定回环接口的地址。

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

      如果存在安全管理器,则将使用主机地址和port作为参数调用其checkConnect方法。这可能导致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方法来创建实际的套接字实现。否则将创建系统默认的套接字实现。

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

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

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

      如果指定的主机为null,则相当于将地址指定为InetAddress.getByName(null)。换句话说,相当于指定回环接口的地址。

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

      如果存在安全管理器,则将使用主机地址和port作为参数调用其checkConnect方法。这可能导致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
      创建一个套接字并将其连接到指定远程地址的指定远程端口。套接字还将绑定到提供的本地地址和端口。

      如果指定的本地地址为null,则相当于指定地址为AnyLocal地址(参见InetAddress.isAnyLocalAddress())。

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

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

      参数:
      address - 远程地址
      port - 远程端口
      localAddr - 套接字绑定到的本地地址,或者null表示anyLocal地址。
      localPort - 套接字绑定到的本地端口,或者zero表示系统选择的空闲端口。
      抛出:
      IOException - 创建套接字时发生I/O错误。
      SecurityException - 如果存在安全管理器,并且其checkConnect方法不允许连接到目的地,或者其checkListen方法不允许绑定到本地端口。
      IllegalArgumentException - 如果端口参数或localPort参数超出有效端口值范围,即0到65535之间(包括边界值)。
      NullPointerException - 如果address为null。
      自从:
      1.1
      参见:
    • Socket

      @Deprecated public Socket(String host, int port, boolean stream) throws IOException
      Deprecated.
      Use DatagramSocket instead for UDP transport.
      创建一个流套接字并将其连接到指定主机上的指定端口号。

      如果指定的主机为null,则相当于将地址指定为InetAddress.getByName(null)。换句话说,相当于指定回环接口的地址。

      如果流参数为true,则创建流套接字。如果流参数为false,则创建数据报套接字。

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

      如果存在安全管理器,则将使用主机地址和port作为参数调用其checkConnect方法。这可能导致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
      Deprecated.
      Use DatagramSocket instead for UDP transport.
      创建一个套接字并将其连接到指定IP地址的指定端口号。

      如果流参数为true,则创建一个流套接字。如果流参数为false,则创建一个数据报套接字。

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

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

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

      参数:
      host - IP地址。
      port - 端口号。
      stream - 如果为true,则创建流套接字;否则创建数据报套接字。
      抛出:
      IOException - 创建套接字时发生I/O错误。
      SecurityException - 如果存在安全管理器且其checkConnect方法不允许该操作。
      IllegalArgumentException - 如果端口参数超出有效端口值范围,即0到65535(包括边界值)之间。
      NullPointerException - 如果host为null。
      参见:
  • Method Details

    • connect

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      返回:
      表示此套接字远程端点的SocketAddress,如果尚未连接则返回null
      自版本:
      1.4
      参见:
    • getLocalSocketAddress

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

      如果套接字绑定到由InetSocketAddress 表示的端点,并且关闭套接字,则此方法在套接字关闭后仍将继续返回InetSocketAddress。在这种情况下,返回的InetSocketAddress的地址是通配符地址,其端口是绑定到的本地端口。

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

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

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

      如果套接字具有通道,则仅当通道本身是通过SocketChannel.openServerSocketChannel.accept方法创建时,套接字才会有一个通道。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      1. 套接字与SocketChannel关联。在这种情况下,中断从输出流写入的线程将关闭底层通道,并导致写入方法抛出带有中断状态的ClosedByInterruptException
      2. 套接字使用系统默认的套接字实现,并且虚拟线程正在向输出流写入。在这种情况下,中断虚拟线程将导致其唤醒并关闭套接字。然后写入方法将抛出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是否已启用。
      返回:
      一个表示TCP_NODELAY是否已启用的boolean
      抛出:
      SocketException - 如果底层协议中存在错误,例如TCP错误。
      自:
      1.1
      参见:
    • setSoLinger

      public void setSoLinger(boolean on, int linger) throws SocketException
      启用/禁用使用指定的逗留时间(以秒为单位)的SO_LINGER。最大超时值是特定于平台的。该设置仅影响套接字关闭。
      参数:
      on - 是否逗留。
      linger - 如果on为true,则逗留多长时间。
      抛出:
      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的任何先前写入之后和将来写入之前发送。
      参数:
      data - 要发送的数据字节
      抛出:
      IOException - 如果发送数据时发生错误。
      自:
      1.4
    • setOOBInline

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

      请注意,仅提供有限的支持来处理传入的紧急数据。特别地,不提供传入紧急数据的通知,并且除非由更高级别的协议提供,否则无法区分普通数据和紧急数据。

      参数:
      on - true表示启用SO_OOBINLINEfalse表示禁用。
      抛出:
      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。将此选项设置为正超时值后,与此Socket关联的InputStream上的read()调用将仅阻塞这段时间。如果超时到期,将引发一个java.net.SocketTimeoutException,尽管Socket仍然有效。超时值为零被解释为无限超时。必须在进入阻塞操作之前启用该选项才能生效。
      参数:
      timeout - 指定的超时时间,以毫秒为单位。
      抛出:
      SocketException - 如果底层协议出现错误,如TCP错误
      IllegalArgumentException - 如果timeout为负数
      自版本:
      1.1
      参见:
    • getSoTimeout

      public int getSoTimeout() throws SocketException
      返回SO_TIMEOUT的设置。0表示该选项已禁用(即无限超时)。
      返回值:
      SocketSO_TIMEOUT选项的设置。
      抛出:
      SocketException - 如果底层协议出现错误,如TCP错误。
      自版本:
      1.1
      参见:
    • setSendBufferSize

      public void setSendBufferSize(int size) throws SocketException
      SocketSO_SNDBUF选项设置为指定值。 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
      SocketSO_RCVBUF选项设置为指定值。 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
      在从此Socket发送的数据包的IP头中设置流量类别或服务类型字节。由于底层网络实现可能会忽略此值,应用程序应将其视为提示。

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

      注:

      对于Internet Protocol 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字段,但不是必须的。因此,连接建立后是否可以更改TOS字段取决于底层平台中的实现。应用程序不应假设它们可以在连接后更改TOS字段。

      对于Internet Protocol v6,tc是将放入IP头的sin6_flowinfo字段的值。

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

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

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

      返回:
      已设置的流量类别或服务类型
      抛出:
      SocketException - 如果获取流量类别或服务类型值时出现错误。
      自版本:
      1.4
      另请参阅:
    • setReuseAddress

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

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

      在使用 SO_REUSEADDR 绑定套接字之前启用,允许即使先前的连接处于超时状态,也可以绑定套接字。

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

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

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

      public boolean getReuseAddress() throws SocketException
      检查 SO_REUSEADDR 是否已启用。
      返回:
      一个指示 SO_REUSEADDR 是否已启用的 boolean 值。
      抛出:
      SocketException - 如果底层协议中出现错误,如 TCP 错误。
      自版本:
      1.4
      另请参阅:
    • close

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

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

      一旦套接字被关闭,它将不再可用于进一步的网络使用(即无法重新连接或重新绑定)。需要创建新的套接字。

      关闭此套接字还将关闭套接字的 InputStreamOutputStream

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

      指定者:
      close 在接口 AutoCloseable
      指定者:
      close 在接口 Closeable
      抛出:
      IOException - 如果关闭此套接字时发生 I/O 错误。
      另请参阅:
      • isClosed(int)
    • 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()
      返回套接字的连接状态。

      注意:关闭套接字不会清除其连接状态,这意味着如果成功连接后关闭套接字(请参见 isClosed()),此方法将返回 true

      返回:
      如果套接字成功连接到服务器,则返回 true
      自版本:
      1.4
    • isBound

      public boolean isBound()
      返回套接字的绑定状态。

      注意:关闭套接字不会清除其绑定状态,这意味着如果成功绑定后关闭套接字(请参见 isClosed()),此方法将返回 true

      返回:
      如果套接字成功绑定到地址,则返回 true
      自版本:
      1.4
      另请参阅:
    • isClosed

      public boolean isClosed()
      返回套接字的关闭状态。
      返回:
      如果套接字已关闭,则返回 true
      自版本:
      1.4
      另请参阅:
    • isInputShutdown

      public boolean isInputShutdown()
      返回套接字连接的读半部分是否关闭。
      返回:
      如果套接字的输入已关闭,则返回 true
      自版本:
      1.4
      另请参阅:
    • isOutputShutdown

      public boolean isOutputShutdown()
      返回套接字连接的写半部分是否关闭。
      返回:
      如果套接字的输出已关闭,则返回 true
      自版本:
      1.4
      另请参阅:
    • setSocketImplFactory

      @Deprecated(since="17") public static void setSocketImplFactory(SocketImplFactory fac) throws IOException
      Deprecated.
      Use a SocketFactory and subclass Socket directly.
      This method provided a way in early JDK releases to replace the system wide implementation of Socket. It has been mostly obsolete since Java 1.4. If required, a Socket can be created to use a custom implementation by extending Socket and using the protected constructor that takes an implementation as a parameter.
      为应用程序设置客户端套接字实现工厂。工厂只能指定一次。

      当应用程序创建新的客户端套接字时,将调用套接字实现工厂的 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 - 如果name为null
      SecurityException - 如果设置了安全管理器,如果套接字选项需要安全权限,且调用者没有所需权限。 StandardSocketOptions不需要任何安全权限。
      自版本:
      9
    • getOption

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

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