模块  java.base
软件包  java.net

Interface SocketOptions

  • 所有已知实现类:
    DatagramSocketImplSocketImpl

    public interface SocketOptions
    获取/设置套接字选项的方法接口。 该接口由以下实现: SocketImplDatagramSocketImpl 这些子类应覆盖此接口的方法,以支持自己的选项。

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

    从以下版本开始:
    1.1
    • 字段汇总

      字段  
      变量和类型 字段 描述
      static int IP_MULTICAST_IF
      设置发送组播数据包的出接口。
      static int IP_MULTICAST_IF2
      与上面相同。
      static int IP_MULTICAST_LOOP
      此选项启用或禁用多播数据报的本地环回。
      static int IP_TOS
      此选项设置TCP或UDP套接字的IP标头中的服务类型或流量类字段。
      static int SO_BINDADDR
      获取套接字的本地地址绑定(此选项不能仅“设置”为“已获取”,因为套接字在创建时绑定,因此无法更改本地绑定的地址)。
      static int SO_BROADCAST
      为套接字设置SO_BROADCAST。
      static int SO_KEEPALIVE
      当为TCP套接字设置keepalive选项并且在任一方向上没有跨套接字交换数据2小时(注意:实际值取决于实现),TCP会自动向对等方发送keepalive探测。
      static int SO_LINGER
      指定关闭时延迟超时。
      static int SO_OOBINLINE
      设置OOBINLINE选项后,将通过套接字输入流接收套接字上收到的任何TCP紧急数据。
      static int SO_RCVBUF
      设置提示平台用于传入网络I / O的底层缓冲区的大小。
      static int SO_REUSEADDR
      为套接字设置SO_REUSEADDR。
      static int SO_REUSEPORT
      为套接字设置SO_REUSEPORT。
      static int SO_SNDBUF
      设置提示平台用于传出网络I / O的底层缓冲区的大小。
      static int SO_TIMEOUT
      在阻止Socket操作时设置超时:
      static int TCP_NODELAY
      禁用Nagle的此连接算法。
    • 字段详细信息

      • SO_BINDADDR

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

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

        适用于:SocketImpl,DatagramSocketImpl

        另请参见:
        Socket.getLocalAddress()DatagramSocket.getLocalAddress()常数字段值
      • 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
        另请参见:
        StandardSocketOptions.SO_REUSEPORT常数字段值
      • SO_BROADCAST

        @Native
        static final int SO_BROADCAST
        为套接字设置SO_BROADCAST。 此选项启用和禁用进程发送广播消息的能力。 它仅支持数据报套接字,仅支持支持广播消息概念的网络(例如以太网,令牌环等),并且默认情况下为DatagramSockets设置。
        从以下版本开始:
        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()立即返回。 使用非零整数启用此选项意味着close()将阻止等待传输并确认写入对等端的所有数据,此时套接字将正常关闭。 达到延迟超时后,使用TCP RST 强制关闭套接字。 启用超时为零的选项会立即强制关闭。 如果指定的超时值超过65,535,则将减少到65,535。

        仅对TCP:SocketImpl有效

        另请参见:
        Socket.setSoLinger(boolean, int)Socket.getSoLinger()常数字段值
      • SO_TIMEOUT

        @Native
        static final int SO_TIMEOUT
        在阻止Socket操作时设置超时:
          ServerSocket.accept();
         SocketInputStream.read();
         DatagramSocket.receive(); 

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

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

        另请参见:
        Socket.setSoTimeout(int)ServerSocket.setSoTimeout(int)DatagramSocket.setSoTimeout(int)常数字段值
      • SO_KEEPALIVE

        @Native
        static final int SO_KEEPALIVE
        当为TCP套接字设置keepalive选项并且在任一方向上没有跨套接字交换数据2小时(注意:实际值取决于实现),TCP会自动向对等方发送keepalive探测。 此探测是对等方必须响应的TCP段。 预期三个响应之一:1。对等体以预期的ACK响应。 未通知应用程序(因为一切正常)。 在另外2小时不活动之后,TCP将发送另一个探测。 2.对等体使用RST进行响应,该RST告知本地TCP对等主机已崩溃并重新启动。 插座已关闭。 3.同行没有回应。 插座已关闭。 此选项的目的是检测对等主机是否崩溃。 仅对TCP套接字有效:SocketImpl
        另请参见:
        Socket.setKeepAlive(boolean)Socket.getKeepAlive()常数字段值
    • 方法详细信息

      • setOption

        void setOption​(int optID,
                       Object value)
                throws SocketException
        启用/禁用optID指定的选项。 如果要启用该选项,并且它采用特定于选项的“值”,则会传递该 实际的值类型是特定于选项的,传递不符合预期类型的内容是错误的:
          SocketImpl s;
         ...
         s.setOption(SO_LINGER, new Integer(10));
            // OK - set SO_LINGER w/ timeout of 10 sec.
         s.setOption(SO_LINGER, new Double(10));
            // ERROR - expects java.lang.Integer 
        如果请求的选项是二进制的,则可以使用此方法通过java.lang.Boolean设置它:
          s.setOption(TCP_NODELAY, Boolean.TRUE);
            // OK - enables TCP_NODELAY, a binary option 

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

        对于具有on和off概念并且需要非布尔参数的选项,将其值设置为除Boolean.FALSE以外的任何值都会隐式启用它。
        如果选项无法识别,套接字关闭或发生某些低级错误,则抛出SocketException
        参数
        optID - 标识选项
        value - 套接字选项的参数
        异常
        SocketException - 如果无法识别该选项,则会关闭套接字,或者发生某些低级错误
        另请参见:
        getOption(int)
      • 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()) {
             // true if TCP_NODELAY is enabled...
         ...
         } 

        对于将特定类型作为参数的选项,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 {
           // the true type of o is java.lang.Boolean.FALSE;
         } 
        参数
        optID - 标识要获取的选项的 int
        结果
        期权的价值
        异常
        SocketException - 如果套接字已关闭
        SocketException - 如果协议栈中的 optID未知(包括SocketImpl)
        另请参见:
        setOption(int, java.lang.Object)