鴻蒙OS SocketOptions

2022-06-06 17:31 更新

SocketOptions

public interface SocketOptions

獲取/設置套接字選項的方法接口。 該接口由:SocketImpl 和 DatagramSocketImpl 實現(xiàn)。 這些子類應該覆蓋這個接口的方法,以支持他們自己的選項。

在此接口中指定選項的方法和常量僅用于實現(xiàn)。 如果您沒有繼承 SocketImpl 或 DatagramSocketImpl,則不會直接使用它們。 在 Socket、ServerSocket、DatagramSocket 和 MulticastSocket 中有類型安全的方法來獲取/設置這些選項。

字段摘要

修飾符和類型 字段 描述
static int IP_MULTICAST_IF 設置發(fā)送多播數(shù)據(jù)包的出接口。
static int IP_MULTICAST_IF2 和上面一樣。
static int IP_MULTICAST_LOOP 此選項啟用或禁用多播數(shù)據(jù)報的本地環(huán)回。
static int IP_TOS 此選項設置 TCP 或 UDP 套接字的 IP 標頭中的服務類型或流量類別字段。
static int SO_BINDADDR 獲取套接字的本地地址綁定(此選項不能“設置”,只能“獲取”,因為套接字是在創(chuàng)建時綁定的,因此不能更改本地綁定地址)。
static int SO_BROADCAST 為套接字設置 SO_BROADCAST。
static int SO_KEEPALIVE 如果為 TCP 套接字設置了 keepalive 選項,并且在 2 小時內沒有通過套接字在任一方向上交換數(shù)據(jù)(注意:實際值取決于實現(xiàn)),TCP 會自動向對等方發(fā)送 keepalive 探測。
static int SO_LINGER 指定關閉時延遲超時。
static int SO_OOBINLINE 當設置 OOBINLINE 選項時,套接字上接收到的任何 TCP 緊急數(shù)據(jù)都將通過套接字輸入流接收。
static int SO_RCVBUF 設置平臺用于傳入網(wǎng)絡 I/O 的底層緩沖區(qū)大小的提示。
static int SO_REUSEADDR 為套接字設置 SO_REUSEADDR。
static int SO_SNDBUF 設置平臺用于傳出網(wǎng)絡 I/O 的底層緩沖區(qū)大小的提示。
static int SO_TIMEOUT 設置阻塞 Socket 操作的超時時間:
static int TCP_NODELAY 禁用此連接的 Nagle 算法。

方法總結

修飾符和類型 方法 描述
Object getOption(int optID) 獲取選項的值。
void setOption(int optID, Object value) 啟用/禁用 optID 指定的選項。

字段詳細信息

IP_MULTICAST_IF

static final int IP_MULTICAST_IF

設置發(fā)送多播數(shù)據(jù)包的出接口。 在具有多個網(wǎng)絡接口的主機上很有用,其中應用程序希望使用系統(tǒng)默認值以外的方式。 獲取/返回一個 InetAddress。

對多播有效:DatagramSocketImpl

IP_MULTICAST_IF2

static final int IP_MULTICAST_IF2

和上面一樣。 引入此選項后,IP_MULTICAST_IF 的行為將保持與以前相同,而此新選項可以支持使用 IPv4 和 IPv6 地址設置傳出接口。 注意:確保與此沒有沖突

IP_MULTICAST_LOOP

static final int IP_MULTICAST_LOOP

此選項啟用或禁用多播數(shù)據(jù)報的本地環(huán)回。 多播套接字默認啟用此選項。

IP_TOS

static final int IP_TOS

此選項設置 TCP 或 UDP 套接字的 IP 標頭中的服務類型或流量類別字段。

SO_BINDADDR

static final int SO_BINDADDR

獲取套接字的本地地址綁定(此選項不能“設置”,只能“獲取”,因為套接字是在創(chuàng)建時綁定的,因此不能更改本地綁定地址)。 套接字的默認本地地址是 INADDR_ANY,表示多宿主主機上的任何本地地址。 多宿主主機可以使用此選項僅接受到其地址之一的連接(在 ServerSocket 或 DatagramSocket 的情況下),或指定其到對等方的返回地址(對于 Socket 或 DatagramSocket)。 此選項的參數(shù)是 InetAddress。

此選項必須在構造函數(shù)中指定。

適用于:SocketImpl、DatagramSocketImpl

SO_BROADCAST

static final int SO_BROADCAST

為套接字設置 SO_BROADCAST。 此選項啟用和禁用進程發(fā)送廣播消息的能力。 它僅支持數(shù)據(jù)報套接字,并且僅在支持廣播消息概念的網(wǎng)絡(例如以太網(wǎng)、令牌環(huán)等)上受支持,并且默認為 DatagramSockets 設置。

SO_KEEPALIVE

static final int SO_KEEPALIVE

如果為 TCP 套接字設置了 keepalive 選項,并且在 2 小時內沒有通過套接字在任一方向上交換數(shù)據(jù)(注意:實際值取決于實現(xiàn)),TCP 會自動向對等方發(fā)送 keepalive 探測。 此探測是對等方必須響應的 TCP 段。 期望三個響應之一: 1. 對等點以期望的 ACK 響應。 不通知應用程序(因為一切正常)。 TCP 將在另外 2 小時不活動后發(fā)送另一個探測。 2. 對端響應一個 RST,告訴本地 TCP 對端主機已經(jīng)崩潰并重新啟動。 插座已關閉。 3. 對端無響應。 插座已關閉。 此選項的目的是檢測對等主機是否崩潰。 僅對 TCP 套接字有效:SocketImpl

SO_LINGER

static final int SO_LINGER

指定關閉時延遲超時。 此選項禁用/啟用從 TCP 套接字的 close() 立即返回。 使用非零整數(shù)超時啟用此選項意味著 close() 將阻止等待寫入對等方的所有數(shù)據(jù)的傳輸和確認,此時套接字將正常關閉。 達到延遲超時后,套接字將通過 TCP RST 強制關閉。 啟用超時為零的選項會立即強制關閉。 如果指定的超時值超過 65,535,它將減少到 65,535。

僅對 TCP 有效:SocketImpl

SO_OOBINLINE

static final int SO_OOBINLINE

當設置 OOBINLINE 選項時,套接字上接收到的任何 TCP 緊急數(shù)據(jù)都將通過套接字輸入流接收。 當該選項被禁用(這是默認設置)時,緊急數(shù)據(jù)將被靜默丟棄。

SO_RCVBUF

static final int SO_RCVBUF

設置平臺用于傳入網(wǎng)絡 I/O 的底層緩沖區(qū)大小的提示。 當在 set 中使用時,這是應用程序向內核提出的關于用于通過套接字接收數(shù)據(jù)的緩沖區(qū)大小的建議。 在 get 中使用時,它必須返回平臺在此套接字上接收數(shù)據(jù)時實際使用的緩沖區(qū)大小。 適用于所有套接字:SocketImpl、DatagramSocketImpl

SO_REUSEADDR

static final int SO_REUSEADDR

為套接字設置 SO_REUSEADDR。 這僅用于 java 中的 MulticastSockets,默認情況下為 MulticastSockets 設置。

適用于:DatagramSocketImpl

SO_SNDBUF

static final int SO_SNDBUF

設置平臺用于傳出網(wǎng)絡 I/O 的底層緩沖區(qū)大小的提示。 當在 set 中使用時,這是應用程序向內核提出的關于用于通過套接字發(fā)送的數(shù)據(jù)的緩沖區(qū)大小的建議。 在 get 中使用時,這必須返回平臺在此套接字上發(fā)送數(shù)據(jù)時實際使用的緩沖區(qū)大小。 適用于所有套接字:SocketImpl、DatagramSocketImpl

SO_TIMEOUT

static final int SO_TIMEOUT

設置阻塞 Socket 操作的超時時間:

 ServerSocket.accept();
 SocketInputStream.read();
 DatagramSocket.receive();

必須在進入阻塞操作之前設置該選項才能生效。 如果超時到期并且操作將繼續(xù)阻塞,則會引發(fā) java.io.InterruptedIOException。 在這種情況下,Socket 沒有關閉。

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

TCP_NODELAY

static final int TCP_NODELAY

禁用此連接的 Nagle 算法。 寫入網(wǎng)絡的數(shù)據(jù)不會緩沖等待對先前寫入數(shù)據(jù)的確認。

僅對 TCP 有效:SocketImpl。

方法詳情

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, new Boolean(true));
    // OK - enables TCP_NODELAY, a binary option

任何選項都可以使用此方法和布爾值(false)禁用:

 s.setOption(TCP_NODELAY, new Boolean(false));
    // OK - disables TCP_NODELAY
 s.setOption(SO_LINGER, new Boolean(false));
    // OK - disables SO_LINGER

對于具有 on 和 off 概念并且需要非布爾參數(shù)的選項,將其值設置為 Boolean(false) 以外的任何值都會隱式啟用它。 如果選項無法識別、套接字已關閉或發(fā)生一些低級錯誤,則拋出 SocketException

參數(shù):

參數(shù)名稱 參數(shù)描述
optID 標識選項
value 套接字選項的參數(shù)

Throws:

Throw名稱 Throw描述
SocketException 如果該選項無法識別,則套接字已關閉,或者發(fā)生了一些低級錯誤

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...
 ...
 }

對于將特定類型作為參數(shù)的選項,getOption(int) 將返回參數(shù)的值,否則將返回 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);
 }

參數(shù):

參數(shù)名稱 參數(shù)描述
optID 一個 int 標識要獲取的選項

返回:

option的值

Throws:

Throw名稱 Throw描述
SocketException 如果套接字關閉
SocketException 如果 optID 在協(xié)議棧中是未知的(包括 SocketImpl)
以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號