Module java.base
Package java.net

Interface SocketOptions

所有已知的实现类:
DatagramSocketImpl, SocketImpl

public interface SocketOptions
用于获取/设置套接字选项的方法接口。此接口由:SocketImplDatagramSocketImpl实现。这些类的子类应该重写此接口的方法以支持它们自己的选项。

此接口中指定选项的方法和常量仅供实现使用。如果您不是在子类中使用SocketImpl或DatagramSocketImpl,您不会直接使用这些选项。在Socket、ServerSocket、DatagramSocket和MulticastSocket中有类型安全的方法来获取/设置这些选项中的每一个。

自:
1.1
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    static final int
    设置发送组播数据包的出口接口。
    static final int
    与上述相同。
    static final int
    此选项启用或禁用组播数据报的本地环回。
    static final int
    此选项为TCP或UDP套接字中的IP头部中的服务类型或流量类字段设置类型。
    static final int
    获取套接字的本地地址绑定(此选项只能“获取”而不能“设置”,因为套接字在创建时绑定,因此本地绑定地址无法更改)。
    static final int
    为套接字设置SO_BROADCAST。
    static final int
    当为TCP套接字设置keepalive选项并且在两个小时内未在套接字的任何方向上交换数据时(注意:实际值取决于实现),TCP会自动向对等方发送keepalive探测。
    static final int
    指定在关闭时的延迟超时。
    static final int
    当设置OOBINLINE选项时,套接字上接收到的任何TCP紧急数据将通过套接字输入流接收。
    static final int
    设置平台用于传入网络I/O的底层缓冲区的大小的提示。
    static final int
    为套接字设置SO_REUSEADDR。
    static final int
    为套接字设置SO_REUSEPORT。
    static final int
    设置平台用于传出网络I/O的底层缓冲区的大小的提示。
    static final int
    在阻塞套接字操作上设置超时:
    static final int
    禁用此连接的Nagle算法。
  • Method Summary

    Modifier and Type
    Method
    Description
    getOption(int optID)
    获取选项的值。
    void
    setOption(int optID, Object value)
    启用/禁用由optID指定的选项。
  • Field Details

    • TCP_NODELAY

      @Native static final int TCP_NODELAY
      禁用此连接的Nagle算法。写入网络的数据不会在先前写入数据得到确认之前被缓冲。

      仅适用于TCP:SocketImpl。

      参见:
    • SO_BINDADDR

      @Native static final int SO_BINDADDR
      获取套接字的本地地址绑定(此选项只能“获取”而不能“设置”,因为套接字在创建时绑定,因此本地绑定地址无法更改)。套接字的默认本地地址为INADDR_ANY,表示多宿主主机上的任何本地地址。多宿主主机可以使用此选项仅接受到其地址之一的连接(对于ServerSocket或DatagramSocket的情况),或者为Socket或DatagramSocket指定其返回地址给对等方。此选项的参数是一个InetAddress。

      此选项必须在构造函数中指定。

      适用于:SocketImpl、DatagramSocketImpl

      参见:
    • SO_REUSEADDR

      @Native static final int SO_REUSEADDR
      为套接字设置SO_REUSEADDR。这仅用于java中的MulticastSockets,并且对于MulticastSockets默认设置。

      适用于:DatagramSocketImpl

      参见:
    • SO_REUSEPORT

      @Native static final int SO_REUSEPORT
      为套接字设置SO_REUSEPORT。此选项启用和禁用多个套接字监听相同地址和端口的能力。

      适用于:SocketImpl、DatagramSocketImpl

      自:
      9
      参见:
    • SO_BROADCAST

      @Native static final int SO_BROADCAST
      为套接字设置SO_BROADCAST。此选项启用和禁用进程发送广播消息的能力。仅支持数据报套接字,仅在支持广播消息概念的网络上支持(例如以太网、令牌环等),并且对于DatagramSockets默认设置。
      自:
      1.4
      参见:
    • IP_MULTICAST_IF

      @Native static final int IP_MULTICAST_IF
      设置发送组播数据包的出口接口。在具有多个网络接口的主机上很有用,应用程序希望使用系统默认之外的其他接口。接受/返回一个InetAddress。

      适用于组播:DatagramSocketImpl

      参见:
    • IP_MULTICAST_IF2

      @Native static final int IP_MULTICAST_IF2
      与上述相同。引入此选项是为了保持与IP_MULTICAST_IF的行为与以前相同,同时这个新选项可以支持使用IPv4和IPv6地址设置出口接口。注意:确保没有冲突。
      自:
      1.4
      参见:
    • IP_MULTICAST_LOOP

      @Native static final int IP_MULTICAST_LOOP
      此选项启用或禁用组播数据报的本地环回。对于组播套接字,默认情况下启用此选项。
      自:
      1.4
      参见:
    • IP_TOS

      @Native static final int IP_TOS
      此选项为TCP或UDP套接字中的IP头部中的服务类型或流量类字段设置类型。
      自:
      1.4
      参见:
    • SO_LINGER

      @Native static final int SO_LINGER
      指定在关闭时的延迟超时。此选项禁用/启用TCP套接字的close()后立即返回。使用非零整数timeout启用此选项意味着close()将阻塞,直到所有写入对等方的数据都传输并得到确认,此时套接字将优雅地关闭。达到延迟超时后,套接字将强制性地关闭,使用TCP RST。使用超时值超过65,535将被减少为65,535。

      仅适用于TCP:SocketImpl

      参见:
    • SO_TIMEOUT

      @Native static final int SO_TIMEOUT
      在阻塞套接字操作上设置超时:
       ServerSocket.accept();
       SocketInputStream.read();
       DatagramSocket.receive();
       

      必须在进入阻塞操作之前设置该选项才能生效。如果超时到期且操作将继续阻塞,将引发java.io.InterruptedIOException。在这种情况下套接字不会关闭。

      适用于所有套接字:SocketImpl、DatagramSocketImpl

      参见:
    • SO_SNDBUF

      @Native static final int SO_SNDBUF
      设置平台用于传出网络I/O的底层缓冲区的大小的提示。在设置时,这是应用程序向内核提供关于用于通过套接字发送数据的缓冲区大小的建议。在获取时,必须返回平台在此套接字上发送数据时实际使用的缓冲区大小。

      适用于所有套接字:SocketImpl、DatagramSocketImpl

      参见:
    • SO_RCVBUF

      @Native static final int SO_RCVBUF
      设置一个提示,即平台用于传入网络I/O的底层缓冲区的大小。在设置时,这是应用程序向内核提供关于用于接收套接字数据的缓冲区大小的建议。在获取时,必须返回平台实际在此套接字上接收数据时使用的缓冲区大小。适用于所有套接字:SocketImpl,DatagramSocketImpl
      参见:
    • SO_KEEPALIVE

      @Native static final int SO_KEEPALIVE
      当为TCP套接字设置了keepalive选项,并且在两个小时内(注意:实际值取决于实现)套接字在任一方向上都没有交换数据时,TCP会自动向对等方发送一个keepalive探测。此探测是对等方必须响应的TCP段。期望三种响应之一:1. 对等方以预期的ACK响应。应用程序不会收到通知(因为一切正常)。TCP将在另外2小时的不活动后发送另一个探测。2. 对等方以RST响应,告诉本地TCP对等方主机已崩溃并重新启动。套接字将关闭。3. 对等方没有响应。套接字将关闭。此选项的目的是检测对等方主机是否崩溃。仅适用于TCP套接字:SocketImpl
      参见:
    • SO_OOBINLINE

      @Native static final int SO_OOBINLINE
      当设置OOBINLINE选项时,通过套接字接收到的任何TCP紧急数据将通过套接字输入流接收。当禁用该选项(默认情况下)时,紧急数据将被静默丢弃。
      参见:
  • Method Details

    • setOption

      void setOption(int optID, Object value) throws SocketException
      启用/禁用由optID指定的选项。如果要启用该选项,并且它需要特定的“值”,则将其传递给value。value的实际类型是特定于选项的,传递非预期类型的内容是错误的:
       SocketImpl s;
       ...
       s.setOption(SO_LINGER, Integer.valueOf(10));
          // OK - 设置超时为10秒的SO_LINGER
       s.setOption(SO_LINGER, Double.valueOf(10));
          // 错误 - 预期 java.lang.Integer
      
      如果请求的选项是二进制的,可以使用java.lang.Boolean通过此方法设置:
       s.setOption(TCP_NODELAY, Boolean.TRUE);
          // OK - 启用TCP_NODELAY,一个二进制选项
       

      任何选项都可以使用java.lang.Boolean.FALSE通过此方法禁用:
       s.setOption(TCP_NODELAY, Boolean.FALSE);
          // OK - 禁用TCP_NODELAY
       s.setOption(SO_LINGER, Boolean.FALSE);
          // OK - 禁用SO_LINGER
       

      对于具有开和关概念并需要非布尔参数的选项,将其值设置为除Boolean.FALSE之外的任何内容将隐式启用它。
      如果选项未被识别,套接字已关闭,或发生了一些底层错误,则抛出SocketException
      参数:
      optID - 标识选项
      value - 套接字选项的参数
      抛出:
      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()) {
           // 如果TCP_NODELAY已启用为true...
       ...
       }
       

      对于需要特定类型作为参数的选项,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 {
         // o的真实类型是java.lang.Boolean.FALSE;
       }
       
      参数:
      optID - 用于获取的选项的int标识
      返回:
      选项的值
      抛出:
      SocketException - 如果套接字已关闭
      SocketException - 如果optID在协议栈(包括SocketImpl)中未知
      参见: