鴻蒙OS SocketOptions

2022-06-06 17:31 更新

SocketOptions

public interface SocketOptions

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

在此接口中指定選項(xiàng)的方法和常量?jī)H用于實(shí)現(xiàn)。 如果您沒(méi)有繼承 SocketImpl 或 DatagramSocketImpl,則不會(huì)直接使用它們。 在 Socket、ServerSocket、DatagramSocket 和 MulticastSocket 中有類型安全的方法來(lái)獲取/設(shè)置這些選項(xiàng)。

字段摘要

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

方法總結(jié)

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

字段詳細(xì)信息

IP_MULTICAST_IF

static final int IP_MULTICAST_IF

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

對(duì)多播有效:DatagramSocketImpl

IP_MULTICAST_IF2

static final int IP_MULTICAST_IF2

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

IP_MULTICAST_LOOP

static final int IP_MULTICAST_LOOP

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

IP_TOS

static final int IP_TOS

此選項(xiàng)設(shè)置 TCP 或 UDP 套接字的 IP 標(biāo)頭中的服務(wù)類型或流量類別字段。

SO_BINDADDR

static final int SO_BINDADDR

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

此選項(xiàng)必須在構(gòu)造函數(shù)中指定。

適用于:SocketImpl、DatagramSocketImpl

SO_BROADCAST

static final int SO_BROADCAST

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

SO_KEEPALIVE

static final int SO_KEEPALIVE

如果為 TCP 套接字設(shè)置了 keepalive 選項(xiàng),并且在 2 小時(shí)內(nèi)沒(méi)有通過(guò)套接字在任一方向上交換數(shù)據(jù)(注意:實(shí)際值取決于實(shí)現(xiàn)),TCP 會(huì)自動(dòng)向?qū)Φ确桨l(fā)送 keepalive 探測(cè)。 此探測(cè)是對(duì)等方必須響應(yīng)的 TCP 段。 期望三個(gè)響應(yīng)之一: 1. 對(duì)等點(diǎn)以期望的 ACK 響應(yīng)。 不通知應(yīng)用程序(因?yàn)橐磺姓#?TCP 將在另外 2 小時(shí)不活動(dòng)后發(fā)送另一個(gè)探測(cè)。 2. 對(duì)端響應(yīng)一個(gè) RST,告訴本地 TCP 對(duì)端主機(jī)已經(jīng)崩潰并重新啟動(dòng)。 插座已關(guān)閉。 3. 對(duì)端無(wú)響應(yīng)。 插座已關(guān)閉。 此選項(xiàng)的目的是檢測(cè)對(duì)等主機(jī)是否崩潰。 僅對(duì) TCP 套接字有效:SocketImpl

SO_LINGER

static final int SO_LINGER

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

僅對(duì) TCP 有效:SocketImpl

SO_OOBINLINE

static final int SO_OOBINLINE

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

SO_RCVBUF

static final int SO_RCVBUF

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

SO_REUSEADDR

static final int SO_REUSEADDR

為套接字設(shè)置 SO_REUSEADDR。 這僅用于 java 中的 MulticastSockets,默認(rèn)情況下為 MulticastSockets 設(shè)置。

適用于:DatagramSocketImpl

SO_SNDBUF

static final int SO_SNDBUF

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

SO_TIMEOUT

static final int SO_TIMEOUT

設(shè)置阻塞 Socket 操作的超時(shí)時(shí)間:

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

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

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

TCP_NODELAY

static final int TCP_NODELAY

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

僅對(duì) TCP 有效:SocketImpl。

方法詳情

setOption

void setOption(int optID, Object value) throws SocketException

啟用/禁用 optID 指定的選項(xiàng)。 如果要啟用該選項(xiàng),并且它需要一個(gè)特定于選項(xiàng)的“值”,則將其傳入值。 值的實(shí)際類型是特定于選項(xiàng)的,傳遞不屬于預(yù)期類型的內(nèi)容是錯(cuò)誤的:

 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

如果請(qǐng)求的選項(xiàng)是二進(jìn)制的,則可以通過(guò) java.lang.Boolean 使用此方法設(shè)置:

 s.setOption(TCP_NODELAY, new Boolean(true));
    // OK - enables TCP_NODELAY, a binary option

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

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

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

參數(shù):

參數(shù)名稱 參數(shù)描述
optID 標(biāo)識(shí)選項(xiàng)
value 套接字選項(xiàng)的參數(shù)

Throws:

Throw名稱 Throw描述
SocketException 如果該選項(xiàng)無(wú)法識(shí)別,則套接字已關(guān)閉,或者發(fā)生了一些低級(jí)錯(cuò)誤

getOption

Object getOption(int optID) throws SocketException

獲取選項(xiàng)的值。 如果啟用,二進(jìn)制選項(xiàng)將返回 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...
 ...
 }

對(duì)于將特定類型作為參數(shù)的選項(xiàng),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 一個(gè) int 標(biāo)識(shí)要獲取的選項(xiàng)

返回:

option的值

Throws:

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)