鴻蒙OS DatagramSocket

2022-06-07 17:07 更新

DatagramSocket

java.lang.Object

|---java.net.DatagramSocket

public class DatagramSocket
extends Object
implements Closeable

此類表示用于發(fā)送和接收數(shù)據(jù)報(bào)包的套接字。

數(shù)據(jù)報(bào)套接字是數(shù)據(jù)包傳遞服務(wù)的發(fā)送點(diǎn)或接收點(diǎn)。 在數(shù)據(jù)報(bào)套接字上發(fā)送或接收的每個(gè)數(shù)據(jù)包都被單獨(dú)尋址和路由。 從一臺(tái)機(jī)器發(fā)送到另一臺(tái)機(jī)器的多個(gè)數(shù)據(jù)包可能會(huì)以不同的方式路由,并且可能以任何順序到達(dá)。

在可能的情況下,新構(gòu)建的 DatagramSocket 啟用了 SocketOptions#SO_BROADCAST 套接字選項(xiàng),以允許傳輸廣播數(shù)據(jù)報(bào)。 為了接收廣播數(shù)據(jù)包,應(yīng)將 DatagramSocket 綁定到通配符地址。 在一些實(shí)現(xiàn)中,當(dāng) DatagramSocket 綁定到更具體的地址時(shí),也可以接收廣播包。

示例:DatagramSocket s = new DatagramSocket(null); s.bind(新 InetSocketAddress(8888)); 相當(dāng)于:DatagramSocket s = new DatagramSocket(8888); 這兩種情況都將創(chuàng)建一個(gè) DatagramSocket 能夠在 UDP 端口 8888 上接收廣播。

構(gòu)造函數(shù)摘要

修飾符 構(gòu)造函數(shù) 描述
DatagramSocket() 構(gòu)造一個(gè)數(shù)據(jù)報(bào)套接字并將其綁定到本地主機(jī)上的任何可用端口。
DatagramSocket(int port) 構(gòu)造一個(gè)數(shù)據(jù)報(bào)套接字并將其綁定到本地主機(jī)上的指定端口。
DatagramSocket(int port, InetAddress laddr) 創(chuàng)建一個(gè)數(shù)據(jù)報(bào)套接字,綁定到指定的本地地址。
protected DatagramSocket(DatagramSocketImpl impl) 使用指定的 DatagramSocketImpl 創(chuàng)建一個(gè)未綁定的數(shù)據(jù)報(bào)套接字。
DatagramSocket(SocketAddress bindaddr) 創(chuàng)建一個(gè)數(shù)據(jù)報(bào)套接字,綁定到指定的本地套接字地址。

方法總結(jié)

修飾符和類型 方法 描述
void bind(SocketAddress addr) 將此 DatagramSocket 綁定到特定地址和端口。
void close() 關(guān)閉此數(shù)據(jù)報(bào)套接字。
void connect(InetAddress address, int port) 將套接字連接到此套接字的遠(yuǎn)程地址。
void connect(SocketAddress addr) 將此套接字連接到遠(yuǎn)程套接字地址(IP 地址 + 端口號(hào))。
void disconnect() 斷開(kāi)插座。
boolean getBroadcast() 測(cè)試是否啟用了 SO_BROADCAST。
DatagramChannel getChannel() 返回與此數(shù)據(jù)報(bào)套接字關(guān)聯(lián)的唯一 DatagramChannel 對(duì)象(如果有)。
InetAddress getInetAddress() 返回此套接字連接的地址。
InetAddress getLocalAddress() 獲取套接字綁定的本地地址。
int getLocalPort() 返回此套接字綁定到的本地主機(jī)上的端口號(hào)。
SocketAddress getLocalSocketAddress() 返回此套接字綁定到的端點(diǎn)的地址。
int getPort() 返回此套接字連接到的端口號(hào)。
int getReceiveBufferSize() 獲取此 DatagramSocket 的 SO_RCVBUF 選項(xiàng)的值,即平臺(tái)用于此 DatagramSocket 上的輸入的緩沖區(qū)大小。
SocketAddress getRemoteSocketAddress() 返回此套接字連接到的端點(diǎn)的地址,如果未連接,則返回 null。
boolean getReuseAddress() 測(cè)試是否啟用了 SO_REUSEADDR。
int getSendBufferSize() 獲取此 DatagramSocket 的 SO_SNDBUF 選項(xiàng)的值,即平臺(tái)用于在此 DatagramSocket 上輸出的緩沖區(qū)大小。
int getSoTimeout() 檢索 SO_TIMEOUT 的設(shè)置。
int getTrafficClass() 獲取從此 DatagramSocket 發(fā)送的數(shù)據(jù)包的 IP 數(shù)據(jù)報(bào)標(biāo)頭中的流量類別或服務(wù)類型。
boolean isBound() 返回套接字的綁定狀態(tài)。
boolean isClosed() 返回套接字是否關(guān)閉。
boolean isConnected() 返回套接字的連接狀態(tài)。
void receive(DatagramPacket p) 從這個(gè)套接字接收一個(gè)數(shù)據(jù)報(bào)包。
void send(DatagramPacket p) 從這個(gè)套接字發(fā)送一個(gè)數(shù)據(jù)報(bào)包。
void setBroadcast(boolean on) 啟用/禁用 SO_BROADCAST。
static void setDatagramSocketImplFactory(DatagramSocketImplFactory fac) 為應(yīng)用程序設(shè)置數(shù)據(jù)報(bào)套接字實(shí)現(xiàn)工廠。
void setReceiveBufferSize(int size) 將 SO_RCVBUF 選項(xiàng)設(shè)置為此 DatagramSocket 的指定值。
void setReuseAddress(boolean on) 啟用/禁用 SO_REUSEADDR 套接字選項(xiàng)。
void setSendBufferSize(int size) 將 SO_SNDBUF 選項(xiàng)設(shè)置為此 DatagramSocket 的指定值。
void setSoTimeout(int timeout) 使用指定的超時(shí)啟用/禁用 SO_TIMEOUT,以毫秒為單位。
void setTrafficClass(int tc) 為從此 DatagramSocket 發(fā)送的數(shù)據(jù)報(bào)設(shè)置 IP 數(shù)據(jù)報(bào)頭中的流量類別或服務(wù)類型八位字節(jié)。
從類 java.lang.Object 繼承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

構(gòu)造函數(shù)詳細(xì)信息

DatagramSocket

public DatagramSocket() throws SocketException

構(gòu)造一個(gè)數(shù)據(jù)報(bào)套接字并將其綁定到本地主機(jī)上的任何可用端口。 套接字將綁定到 InetAddress#isAnyLocalAddress 地址,這是內(nèi)核選擇的 IP 地址。

如果存在安全管理器,則首先調(diào)用其 checkListen 方法,并以 0 作為其參數(shù),以確保允許該操作。 這可能會(huì)導(dǎo)致 SecurityException。

Throws:

Throw名稱 Throw描述
SocketException 如果套接字無(wú)法打開(kāi),或者套接字無(wú)法綁定到指定的本地端口。
SecurityException 如果安全管理器存在并且其 checkListen 方法不允許該操作。

DatagramSocket

protected DatagramSocket(DatagramSocketImpl impl)

使用指定的 DatagramSocketImpl 創(chuàng)建一個(gè)未綁定的數(shù)據(jù)報(bào)套接字。

參數(shù):

參數(shù)名稱 參數(shù)描述
impl 子類希望在 DatagramSocket 上使用的 DatagramSocketImpl 的實(shí)例。

DatagramSocket

public DatagramSocket(SocketAddress bindaddr) throws SocketException

創(chuàng)建一個(gè)數(shù)據(jù)報(bào)套接字,綁定到指定的本地套接字地址。

如果地址為空,則創(chuàng)建一個(gè)未綁定的套接字。

如果有安全管理器,首先調(diào)用它的 checkListen 方法,并使用來(lái)自套接字地址的端口作為其參數(shù),以確保允許該操作。 這可能會(huì)導(dǎo)致 SecurityException。

參數(shù):

參數(shù)名稱 參數(shù)描述
bindaddr 要綁定的本地套接字地址,對(duì)于未綁定的套接字,則為 null。

Throws:

Throw名稱 Throw描述
SocketException 如果套接字無(wú)法打開(kāi),或者套接字無(wú)法綁定到指定的本地端口。
SecurityException 如果安全管理器存在并且其 checkListen 方法不允許該操作。

DatagramSocket

public DatagramSocket(int port) throws SocketException

構(gòu)造一個(gè)數(shù)據(jù)報(bào)套接字并將其綁定到本地主機(jī)上的指定端口。 套接字將綁定到 InetAddress#isAnyLocalAddress 地址,這是內(nèi)核選擇的 IP 地址。

如果有安全管理器,首先調(diào)用它的 checkListen 方法,并將端口參數(shù)作為其參數(shù),以確保允許該操作。 這可能會(huì)導(dǎo)致 SecurityException。

參數(shù):

參數(shù)名稱 參數(shù)描述
port 要使用的端口。

Throws:

Throw名稱 Throw描述
SocketException 如果套接字無(wú)法打開(kāi),或者套接字無(wú)法綁定到指定的本地端口。
SecurityException 如果安全管理器存在并且其 checkListen 方法不允許該操作。

DatagramSocket

public DatagramSocket(int port, InetAddress laddr) throws SocketException

創(chuàng)建一個(gè)數(shù)據(jù)報(bào)套接字,綁定到指定的本地地址。 本地端口必須介于 0 和 65535 之間(含)。 如果 IP 地址是 0.0.0.0,則套接字將綁定到 InetAddress#isAnyLocalAddress 地址,這是內(nèi)核選擇的 IP 地址。

如果有安全管理器,首先調(diào)用它的 checkListen 方法,并將端口參數(shù)作為其參數(shù),以確保允許該操作。 這可能會(huì)導(dǎo)致 SecurityException。

參數(shù):

參數(shù)名稱 參數(shù)描述
port 要使用的本地端口
laddr 要綁定的本地地址

Throws:

Throw名稱 Throw描述
SocketException 如果套接字無(wú)法打開(kāi),或者套接字無(wú)法綁定到指定的本地端口。
SecurityException 如果安全管理器存在并且其 checkListen 方法不允許該操作。

Method Detail

bind

public void bind(SocketAddress addr) throws SocketException

將此 DatagramSocket 綁定到特定地址和端口。

如果地址為空,那么系統(tǒng)將選擇一個(gè)臨時(shí)端口和一個(gè)有效的本地地址來(lái)綁定套接字。

參數(shù):

參數(shù)名稱 參數(shù)描述
addr 要綁定的地址和端口。

Throws:

Throw名稱 Throw描述
SocketException 如果在綁定期間發(fā)生任何錯(cuò)誤,或者套接字已經(jīng)綁定。
SecurityException 如果安全管理器存在并且其 checkListen 方法不允許該操作。
IllegalArgumentException 如果 addr 是此套接字不支持的 SocketAddress 子類。

connect

public void connect(InetAddress address, int port)

將套接字連接到此套接字的遠(yuǎn)程地址。當(dāng)套接字連接到遠(yuǎn)程地址時(shí),數(shù)據(jù)包只能發(fā)送到該地址或從該地址接收。默認(rèn)情況下,未連接數(shù)據(jù)報(bào)套接字。

如果套接字連接到的遠(yuǎn)程目標(biāo)不存在,或者無(wú)法到達(dá),并且如果已接收到該地址的 ICMP 目標(biāo)無(wú)法到達(dá)數(shù)據(jù)包,則后續(xù)調(diào)用 send 或 receive 可能會(huì)拋出 PortUnreachableException。請(qǐng)注意,不能保證會(huì)引發(fā)異常。

如果已安裝安全管理器,則調(diào)用它來(lái)檢查對(duì)遠(yuǎn)程地址的訪問(wèn)。具體來(lái)說(shuō),如果給定地址是 InetAddress#isMulticastAddress,則使用給定地址調(diào)用安全管理器的 checkMulticast 方法。否則,使用給定的地址和端口調(diào)用安全管理器的 checkConnect 和 checkAccept 方法,以驗(yàn)證是否允許分別發(fā)送和接收數(shù)據(jù)報(bào)。

當(dāng)套接字連接時(shí),接收和發(fā)送不會(huì)對(duì)傳入和傳出的數(shù)據(jù)包執(zhí)行任何安全檢查,除了匹配數(shù)據(jù)包和套接字的地址和端口。在發(fā)送操作中,如果設(shè)置了數(shù)據(jù)包的地址并且數(shù)據(jù)包的地址和套接字的地址不匹配,則會(huì)拋出 IllegalArgumentException。連接到多播地址的套接字只能用于發(fā)送數(shù)據(jù)包。

參數(shù):

參數(shù)名稱 參數(shù)描述
address 套接字的遠(yuǎn)程地址
port 套接字的遠(yuǎn)程端口。

Throws:

Throw名稱 Throw描述
IllegalArgumentException 如果地址為空,或者端口超出范圍。
SecurityException 如果已安裝安全管理器并且它不允許訪問(wèn)給定的遠(yuǎn)程地址

connect

public void connect(SocketAddress addr) throws SocketException

將此套接字連接到遠(yuǎn)程套接字地址(IP 地址 + 端口號(hào))。

如果給定 InetSocketAddress,則此方法的行為就像使用給定的套接字地址 IP 地址和端口號(hào)調(diào)用 connect(InetAddress,int)。

參數(shù):

參數(shù)名稱 參數(shù)描述
addr 遠(yuǎn)程地址。

Throws:

Throw名稱 Throw描述
SocketException 如果連接失敗
IllegalArgumentException 如果 addr 為 null,或者 addr 是此套接字不支持的 SocketAddress 子類
SecurityException 如果已安裝安全管理器并且它不允許訪問(wèn)給定的遠(yuǎn)程地址

disconnect

public void disconnect()

斷開(kāi)插座。 如果套接字已關(guān)閉或未連接,則此方法無(wú)效。

isBound

public boolean isBound()

返回套接字的綁定狀態(tài)。

如果套接字在關(guān)閉之前已綁定,則此方法將在套接字關(guān)閉后繼續(xù)返回 true。

返回:

如果套接字成功綁定到地址,則為 true

isConnected

public boolean isConnected()

返回套接字的連接狀態(tài)。

如果套接字在關(guān)閉之前已連接,則此方法將在套接字關(guān)閉后繼續(xù)返回 true。

返回:

如果套接字成功連接到服務(wù)器,則為 true

getInetAddress

public InetAddress getInetAddress()

返回此套接字連接的地址。 如果套接字未連接,則返回 null。

如果套接字在關(guān)閉之前已連接,則此方法將在套接字關(guān)閉后繼續(xù)返回已連接的地址。

返回:

此套接字連接到的地址。

getPort

public int getPort()

返回此套接字連接到的端口號(hào)。 如果套接字未連接,則返回 -1。

如果套接字在關(guān)閉之前已連接,則此方法將在套接字關(guān)閉后繼續(xù)返回連接的端口號(hào)。

返回:

此套接字連接到的端口號(hào)。

getRemoteSocketAddress

public SocketAddress getRemoteSocketAddress()

返回此套接字連接到的端點(diǎn)的地址,如果未連接,則返回 null。

如果套接字在關(guān)閉之前已連接,則此方法將在套接字關(guān)閉后繼續(xù)返回已連接的地址。

返回:

表示此套接字的遠(yuǎn)程端點(diǎn)的 SocketAddress,如果尚未連接,則為 null。

getLocalSocketAddress

public SocketAddress getLocalSocketAddress()

返回此套接字綁定到的端點(diǎn)的地址。

返回:

一個(gè) SocketAddress 表示此套接字的本地端點(diǎn),如果它已關(guān)閉或尚未綁定,則為 null。

send

public void send(DatagramPacket p) throws IOException

從這個(gè)套接字發(fā)送一個(gè)數(shù)據(jù)報(bào)包。 DatagramPacket 包括指示要發(fā)送的數(shù)據(jù)、其長(zhǎng)度、遠(yuǎn)程主機(jī)的 IP 地址和遠(yuǎn)程主機(jī)上的端口號(hào)的信息。

如果有安全管理器,并且套接字當(dāng)前未連接到遠(yuǎn)程地址,則此方法首先執(zhí)行一些安全檢查。 首先,如果 p.getAddress().isMulticastAddress() 為真,則此方法以 p.getAddress() 作為參數(shù)調(diào)用安全管理器的 checkMulticast 方法。 如果該表達(dá)式的評(píng)估結(jié)果為假,則此方法將使用參數(shù) p.getAddress().getHostAddress() 和 p.getPort() 調(diào)用安全管理器的 checkConnect 方法。 如果不允許該操作,則對(duì)安全管理器方法的每次調(diào)用都可能導(dǎo)致 SecurityException。

參數(shù):

參數(shù)名稱 參數(shù)描述
p 要發(fā)送的 DatagramPacket。

Throws:

Throw名稱 Throw描述
IOException 如果發(fā)生 I/O 錯(cuò)誤。
SecurityException 如果存在安全管理器并且其 checkMulticast 或 checkConnect 方法不允許發(fā)送。
PortUnreachableException 如果套接字連接到當(dāng)前無(wú)法到達(dá)的目的地,則可能會(huì)拋出。 請(qǐng)注意,不能保證會(huì)引發(fā)異常。
IllegalBlockingModeException 如果此套接字具有關(guān)聯(lián)的通道,并且該通道處于非阻塞模式。
IllegalArgumentException 如果套接字已連接,并且連接地址和數(shù)據(jù)包地址不同。

receive

public void receive(DatagramPacket p) throws IOException

從這個(gè)套接字接收一個(gè)數(shù)據(jù)報(bào)包。 當(dāng)此方法返回時(shí),DatagramPacket 的緩沖區(qū)被接收到的數(shù)據(jù)填充。 數(shù)據(jù)報(bào)包還包含發(fā)送者的 IP 地址和發(fā)送者機(jī)器上的端口號(hào)。

此方法阻塞,直到接收到數(shù)據(jù)報(bào)。 數(shù)據(jù)報(bào)包對(duì)象的長(zhǎng)度字段包含接收到的消息的長(zhǎng)度。 如果消息長(zhǎng)于數(shù)據(jù)包的長(zhǎng)度,則消息被截?cái)唷?/p>

如果有安全管理器,如果安全管理器的 checkAccept 方法不允許,則無(wú)法接收數(shù)據(jù)包。

參數(shù):

參數(shù)名稱 參數(shù)描述
p 放置傳入數(shù)據(jù)的 DatagramPacket。

Throws:

Throw名稱 Throw描述
IOException 如果發(fā)生 I/O 錯(cuò)誤。
SocketTimeoutException 如果之前調(diào)用了 setSoTimeout 并且超時(shí)已過(guò)期。
PortUnreachableException 如果套接字連接到當(dāng)前無(wú)法到達(dá)的目的地,則可能會(huì)拋出。 請(qǐng)注意,不能保證會(huì)引發(fā)異常。
IllegalBlockingModeException 如果此套接字具有關(guān)聯(lián)的通道,并且該通道處于非阻塞模式。

getLocalAddress

public InetAddress getLocalAddress()

獲取套接字綁定的本地地址。

如果有安全管理器,首先調(diào)用它的 checkConnect 方法,并以主機(jī)地址和 -1 作為其參數(shù),以查看是否允許該操作。

返回:

套接字綁定到的本地地址,如果套接字已關(guān)閉,則為 null,或者如果套接字未綁定或安全管理器 checkConnect 方法不允許操作,則表示 InetAddress#isAnyLocalAddress 地址的 InetAddress

getLocalPort

public int getLocalPort()

返回此套接字綁定到的本地主機(jī)上的端口號(hào)。

返回:

此套接字綁定到的本地主機(jī)上的端口號(hào),如果套接字已關(guān)閉,則為 -1,如果尚未綁定,則為 0。

setSoTimeout

public void setSoTimeout(int timeout) throws SocketException

使用指定的超時(shí)啟用/禁用 SO_TIMEOUT,以毫秒為單位。 將此選項(xiàng)設(shè)置為非零超時(shí)后,對(duì)此 DatagramSocket 的 receive() 調(diào)用將僅阻塞此時(shí)間量。 如果超時(shí)到期,則會(huì)引發(fā) java.net.SocketTimeoutException,盡管 DatagramSocket 仍然有效。 必須在進(jìn)入阻塞操作之前啟用該選項(xiàng)才能生效。 超時(shí)必須 > 0。超時(shí)為零被解釋為無(wú)限超時(shí)。

參數(shù):

參數(shù)名稱 參數(shù)描述
timeout 以毫秒為單位的指定超時(shí)。

Throws:

Throw名稱 Throw描述
SocketException 如果底層協(xié)議有錯(cuò)誤,例如 UDP 錯(cuò)誤。

getSoTimeout

public int getSoTimeout() throws SocketException

檢索 SO_TIMEOUT 的設(shè)置。 返回 0 表示該選項(xiàng)被禁用(即無(wú)限超時(shí))。

返回:

SO_TIMEOUT 的設(shè)置

Throws:

Throw名稱 Throw描述
SocketException 如果底層協(xié)議有錯(cuò)誤,例如 UDP 錯(cuò)誤。

setSendBufferSize

public void setSendBufferSize(int size) throws SocketException

將 SO_SNDBUF 選項(xiàng)設(shè)置為此 DatagramSocket 的指定值。 網(wǎng)絡(luò)實(shí)現(xiàn)使用 SO_SNDBUF 選項(xiàng)作為調(diào)整底層網(wǎng)絡(luò) I/O 緩沖區(qū)大小的提示。 網(wǎng)絡(luò)實(shí)現(xiàn)也可以使用 SO_SNDBUF 設(shè)置來(lái)確定可以在此套接字上發(fā)送的數(shù)據(jù)包的最大大小。

由于 SO_SNDBUF 是一個(gè)提示,想要驗(yàn)證緩沖區(qū)大小的應(yīng)用程序應(yīng)該調(diào)用 getSendBufferSize()。

當(dāng)發(fā)送速率很高時(shí),增加緩沖區(qū)大小可能允許網(wǎng)絡(luò)實(shí)現(xiàn)將多個(gè)傳出數(shù)據(jù)包排隊(duì)。

注意:如果使用 send(java.net.DatagramPacket) 發(fā)送大于 SO_SNDBUF 設(shè)置的 DatagramPacket,則發(fā)送或丟棄數(shù)據(jù)包是特定于實(shí)現(xiàn)的。

參數(shù):

參數(shù)名稱 參數(shù)描述
size 設(shè)置發(fā)送緩沖區(qū)大小的大小。 該值必須大于 0。

Throws:

Throw名稱 Throw描述
SocketException 如果底層協(xié)議有錯(cuò)誤,例如 UDP 錯(cuò)誤。
IllegalArgumentException 如果值為 0 或?yàn)樨?fù)數(shù)。

getSendBufferSize

public int getSendBufferSize() throws SocketException

獲取此 DatagramSocket 的 SO_SNDBUF 選項(xiàng)的值,即平臺(tái)用于在此 DatagramSocket 上輸出的緩沖區(qū)大小。

返回:

此 DatagramSocket 的 SO_SNDBUF 選項(xiàng)的值

Throws:

Throw名稱 Throw描述
SocketException 如果底層協(xié)議有錯(cuò)誤,例如 UDP 錯(cuò)誤。

setReceiveBufferSize

public void setReceiveBufferSize(int size) throws SocketException

將 SO_RCVBUF 選項(xiàng)設(shè)置為此 DatagramSocket 的指定值。 網(wǎng)絡(luò)實(shí)現(xiàn)使用 SO_RCVBUF 選項(xiàng)作為調(diào)整底層網(wǎng)絡(luò) I/O 緩沖區(qū)大小的提示。 網(wǎng)絡(luò)實(shí)現(xiàn)也可以使用 SO_RCVBUF 設(shè)置來(lái)確定可以在此套接字上接收的數(shù)據(jù)包的最大大小。

因?yàn)?SO_RCVBUF 是一個(gè)提示,所以想要驗(yàn)證緩沖區(qū)設(shè)置為多大大小的應(yīng)用程序應(yīng)該調(diào)用 getReceiveBufferSize()。

當(dāng)數(shù)據(jù)包到達(dá)的速度快于使用接收(java.net.DatagramPacket)接收的速度時(shí),增加 SO_RCVBUF 可能允許網(wǎng)絡(luò)實(shí)現(xiàn)緩沖多個(gè)數(shù)據(jù)包。

注意:是否可以接收到大于 SO_RCVBUF 的數(shù)據(jù)包是特定于實(shí)現(xiàn)的。

參數(shù):

參數(shù)名稱 參數(shù)描述
size 設(shè)置接收緩沖區(qū)大小的大小。 該值必須大于 0。

Throws:

Throw名稱 Throw描述
SocketException 如果底層協(xié)議有錯(cuò)誤,例如 UDP 錯(cuò)誤。
IllegalArgumentException 如果值為 0 或?yàn)樨?fù)數(shù)。

getReceiveBufferSize

public int getReceiveBufferSize() throws SocketException

獲取此 DatagramSocket 的 SO_RCVBUF 選項(xiàng)的值,即平臺(tái)用于此 DatagramSocket 上的輸入的緩沖區(qū)大小。

返回:

此 DatagramSocket 的 SO_RCVBUF 選項(xiàng)的值

Throws:

Throw名稱 Throw描述
SocketException 如果底層協(xié)議有錯(cuò)誤,例如 UDP 錯(cuò)誤。

setReuseAddress

public void setReuseAddress(boolean on) throws SocketException

啟用/禁用 SO_REUSEADDR 套接字選項(xiàng)。

對(duì)于 UDP 套接字,可能需要將多個(gè)套接字綁定到同一個(gè)套接字地址。 這通常用于接收多播數(shù)據(jù)包(請(qǐng)參閱 MulticastSocket)。 如果在使用 bind(java.net.SocketAddress) 綁定套接字之前啟用了 SO_REUSEADDR 套接字選項(xiàng),則 SO_REUSEADDR 套接字選項(xiàng)允許將多個(gè)套接字綁定到同一個(gè)套接字地址。

注意:并非所有現(xiàn)有平臺(tái)都支持此功能,因此是否忽略此選項(xiàng)取決于具體實(shí)現(xiàn)。 但是,如果不支持,則 getReuseAddress() 將始終返回 false。

創(chuàng)建 DatagramSocket 時(shí),SO_REUSEADDR 的初始設(shè)置被禁用。

未定義套接字綁定后啟用或禁用 SO_REUSEADDR 時(shí)的行為。

參數(shù):

參數(shù)名稱 參數(shù)描述
on 是否啟用或禁用

Throws:

Throw名稱 Throw描述
SocketException 如果啟用或禁用 SO_RESUEADDR 套接字選項(xiàng)發(fā)生錯(cuò)誤,或者套接字已關(guān)閉。

getReuseAddress

public boolean getReuseAddress() throws SocketException

測(cè)試是否啟用了 SO_REUSEADDR。

返回:

一個(gè)布爾值,指示是否啟用 SO_REUSEADDR。

Throws:

Throw名稱 Throw描述
SocketException 如果底層協(xié)議有錯(cuò)誤,例如 UDP 錯(cuò)誤。

setBroadcast

public void setBroadcast(boolean on) throws SocketException

啟用/禁用 SO_BROADCAST。

某些操作系統(tǒng)可能要求以實(shí)現(xiàn)特定權(quán)限啟動(dòng) Java 虛擬機(jī)以啟用此選項(xiàng)或發(fā)送廣播數(shù)據(jù)報(bào)。

參數(shù):

參數(shù)名稱 參數(shù)描述
on 是否開(kāi)啟廣播。

Throws:

Throw名稱 Throw描述
SocketException 如果底層協(xié)議有錯(cuò)誤,例如 UDP 錯(cuò)誤。

getBroadcast

public boolean getBroadcast() throws SocketException

測(cè)試是否啟用了 SO_BROADCAST。

返回:

一個(gè)布爾值,指示是否啟用 SO_BROADCAST。

Throws:

Throw名稱 Throw描述
SocketException 如果底層協(xié)議有錯(cuò)誤,例如 UDP 錯(cuò)誤。

setTrafficClass

public void setTrafficClass(int tc) throws SocketException

為從此 DatagramSocket 發(fā)送的數(shù)據(jù)報(bào)設(shè)置 IP 數(shù)據(jù)報(bào)頭中的流量類別或服務(wù)類型八位字節(jié)。 由于底層網(wǎng)絡(luò)實(shí)現(xiàn)可能會(huì)忽略此值,因此應(yīng)用程序應(yīng)將其視為提示。

tc 必須在 0 <= tc <= 255 范圍內(nèi),否則將拋出 IllegalArgumentException。

筆記:

對(duì)于 Internet 協(xié)議 v4,該值由一個(gè)整數(shù)組成,其中最低有效 8 位表示套接字發(fā)送的 IP 數(shù)據(jù)包中 TOS 八位字節(jié)的值。 RFC 1349 定義 TOS 值如下:

  • IPTOS_LOWCOST (0x02)
  • IPTOS_RELIABILITY (0x04)
  • IPTOS_THROUGHPUT (0x08)
  • IPTOS_LOWDELAY (0x10)

最后一個(gè)低位總是被忽略,因?yàn)樗鼘?duì)應(yīng)于 MBZ(必須為零)位。

設(shè)置優(yōu)先級(jí)字段中的位可能會(huì)導(dǎo)致 SocketException 指示不允許該操作。

對(duì)于 Internet 協(xié)議 v6,tc 是放置在 IP 標(biāo)頭的 sin6_flowinfo 字段中的值。

參數(shù):

參數(shù)名稱 參數(shù)描述
tc 位集的 int 值。

Throws:

Throw名稱 Throw描述
SocketException 如果設(shè)置流量類別或服務(wù)類型時(shí)出錯(cuò)

getTrafficClass

public int getTrafficClass() throws SocketException

獲取從此 DatagramSocket 發(fā)送的數(shù)據(jù)包的 IP 數(shù)據(jù)報(bào)標(biāo)頭中的流量類別或服務(wù)類型。

由于底層網(wǎng)絡(luò)實(shí)現(xiàn)可能會(huì)忽略使用 setTrafficClass(int) 設(shè)置的流量類或服務(wù)類型,因此此方法可能返回與之前使用此 DatagramSocket 上的 setTrafficClass(int) 方法設(shè)置的值不同的值。

返回:

已設(shè)置的流量類別或服務(wù)類型

Throws:

Throw名稱 Throw描述
SocketException 如果獲取流量類別或服務(wù)類型值時(shí)出錯(cuò)。

close

public void close()

關(guān)閉此數(shù)據(jù)報(bào)套接字。

當(dāng)前在此套接字上的接收(java.net.DatagramPacket)中阻塞的任何線程都將拋出 SocketException。

如果此套接字具有關(guān)聯(lián)的通道,則該通道也將關(guān)閉。

指定者:

在接口 AutoCloseable 中關(guān)閉

指定者:

在接口Closeable中關(guān)閉

isClosed

public boolean isClosed()

返回套接字是否關(guān)閉。

返回:

如果套接字已關(guān)閉,則為 true

getChannel

public DatagramChannel getChannel()

返回與此數(shù)據(jù)報(bào)套接字關(guān)聯(lián)的唯一 DatagramChannel 對(duì)象(如果有)。

當(dāng)且僅當(dāng)通道本身是通過(guò) DatagramChannel.open 方法創(chuàng)建時(shí),數(shù)據(jù)報(bào)套接字才會(huì)具有通道。

返回:

與此數(shù)據(jù)報(bào)套接字關(guān)聯(lián)的數(shù)據(jù)報(bào)通道,如果此套接字不是為通道創(chuàng)建的,則為 null

setDatagramSocketImplFactory

public static void setDatagramSocketImplFactory(DatagramSocketImplFactory fac) throws IOException

為應(yīng)用程序設(shè)置數(shù)據(jù)報(bào)套接字實(shí)現(xiàn)工廠。 工廠只能指定一次。

當(dāng)應(yīng)用程序創(chuàng)建新的數(shù)據(jù)報(bào)套接字時(shí),會(huì)調(diào)用套接字實(shí)現(xiàn)工廠的 createDatagramSocketImpl 方法來(lái)創(chuàng)建實(shí)際的數(shù)據(jù)報(bào)套接字實(shí)現(xiàn)。

除非已經(jīng)設(shè)置了工廠,否則將 null 傳遞給方法是無(wú)操作的。

如果有安全管理器,該方法首先調(diào)用安全管理器的 checkSetFactory 方法,確保操作被允許。 這可能會(huì)導(dǎo)致 SecurityException。

參數(shù):

參數(shù)名稱 參數(shù)描述
fac 想要的工廠。

Throws:

Throw名稱 Throw描述
IOException 如果在設(shè)置數(shù)據(jù)報(bào)套接字工廠時(shí)發(fā)生 I/O 錯(cuò)誤。
SocketException 如果工廠已經(jīng)定義。
SecurityException 如果存在安全管理器并且其 checkSetFactory 方法不允許該操作。
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)