鴻蒙OS MulticastSocket

2022-06-10 16:28 更新

MulticastSocket

java.lang.Object

|---java.net.DatagramSocket

|---|---java.net.MulticastSocket

public class MulticastSocket
extends DatagramSocket

多播數(shù)據(jù)報(bào)套接字類(lèi)對(duì)于發(fā)送和接收 IP 多播數(shù)據(jù)包很有用。 MulticastSocket 是一個(gè) (UDP) DatagramSocket,具有加入 Internet 上其他多播主機(jī)“組”的附加功能。

多播組由 D 類(lèi) IP 地址和標(biāo)準(zhǔn) UDP 端口號(hào)指定。 D 類(lèi) IP 地址的范圍為 224.0.0.0 到 239.255.255.255(含)。 地址 224.0.0.0 已保留,不應(yīng)使用。

可以通過(guò)首先使用所需端口創(chuàng)建 MulticastSocket,然后調(diào)用 joinGroup(InetAddress groupAddr) 方法來(lái)加入多播組:

 // join a Multicast group and send the group salutations
 ...
 String msg = "Hello";
 InetAddress group = InetAddress.getByName("228.5.6.7");
 MulticastSocket s = new MulticastSocket(6789);
 s.joinGroup(group);
 DatagramPacket hi = new DatagramPacket(msg.getBytes(), msg.length(),
                             group, 6789);
 s.send(hi);
 // get their responses!
 byte[] buf = new byte[1000];
 DatagramPacket recv = new DatagramPacket(buf, buf.length);
 s.receive(recv);
 ...
 // OK, I'm done talking - leave the group...
 s.leaveGroup(group);

當(dāng)一個(gè)人向多播組發(fā)送消息時(shí),該主機(jī)和端口的所有訂閱接收者都會(huì)收到該消息(在數(shù)據(jù)包的生存時(shí)間范圍內(nèi),見(jiàn)下文)。 套接字不必是多播組的成員即可向其發(fā)送消息。

當(dāng)套接字訂閱多播組/端口時(shí),它會(huì)接收其他主機(jī)發(fā)送到該組/端口的數(shù)據(jù)報(bào),該組和端口的所有其他成員也是如此。 套接字通過(guò) leaveGroup(InetAddress addr) 方法放棄組中的成員資格。 多個(gè)MulticastSocket 可以同時(shí)訂閱一個(gè)組播組和端口,它們都將接收組數(shù)據(jù)報(bào)。

目前不允許小程序使用多播套接字。

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

構(gòu)造函數(shù) 描述
MulticastSocket() 創(chuàng)建一個(gè)多播套接字。
MulticastSocket(int port) 創(chuàng)建一個(gè)多播套接字并將其綁定到特定端口。
MulticastSocket(SocketAddress bindaddr) 創(chuàng)建一個(gè)綁定到指定套接字地址的 MulticastSocket。

方法總結(jié)

修飾符和類(lèi)型 方法 描述
InetAddress getInterface() 檢索用于多播數(shù)據(jù)包的網(wǎng)絡(luò)接口的地址。
boolean getLoopbackMode() 獲取組播數(shù)據(jù)報(bào)本地環(huán)回的設(shè)置。
NetworkInterface getNetworkInterface() 獲取組播網(wǎng)絡(luò)接口集。
int getTimeToLive() 獲取在套接字上發(fā)送的多播數(shù)據(jù)包的默認(rèn)生存時(shí)間。
byte getTTL() 已棄用。 改用 getTimeToLive 方法,它返回一個(gè) int 而不是一個(gè)字節(jié)。
void joinGroup(InetAddress mcastaddr) 加入多播組。
void joinGroup(SocketAddress mcastaddr, NetworkInterface netIf) 在指定接口加入指定的組播組。
void leaveGroup(InetAddress mcastaddr) 離開(kāi)一個(gè)多播組。
void leaveGroup(SocketAddress mcastaddr, NetworkInterface netIf) 將組播組留在指定的本地接口上。
void send(DatagramPacket p, byte ttl) 已棄用。 請(qǐng)改用以下代碼或其等效代碼:...... int ttl = mcastSocket.getTimeToLive(); mcastSocket.setTimeToLive(newttl); mcastSocket.send(p); mcastSocket.setTimeToLive(ttl); ……
void setInterface(InetAddress inf) 設(shè)置行為將受網(wǎng)絡(luò)接口值影響的方法使用的多播網(wǎng)絡(luò)接口。
void setLoopbackMode(boolean disable) 禁用/啟用多播數(shù)據(jù)報(bào)的本地環(huán)回 該選項(xiàng)被平臺(tái)的網(wǎng)絡(luò)代碼用作設(shè)置多播數(shù)據(jù)是否將環(huán)回本地套接字的提示。
void setNetworkInterface(NetworkInterface netIf) 指定在此套接字上發(fā)送的傳出多播數(shù)據(jù)報(bào)的網(wǎng)絡(luò)接口。
void setTimeToLive(int ttl) 設(shè)置在此 MulticastSocket 上發(fā)送的多播數(shù)據(jù)包的默認(rèn)生存時(shí)間,以控制多播的范圍。
void setTTL(byte ttl) 已棄用。 改用 setTimeToLive 方法,該方法使用 int 而不是 byte 作為 ttl 的類(lèi)型。
從類(lèi) java.net.DatagramSocket 繼承的方法
bind, close, connect, connect, disconnect, getBroadcast, getChannel, getInetAddress, getLocalAddress, getLocalPort, getLocalSocketAddress, getPort, getReceiveBufferSize, getRemoteSocketAddress, getReuseAddress, getSendBufferSize, getSoTimeout, getTrafficClass, isBound, isClosed, isConnected, receive, send, setBroadcast, setDatagramSocketImplFactory, setReceiveBufferSize, setReuseAddress, setSendBufferSize, setSoTimeout, setTrafficClass
從類(lèi) java.lang.Object 繼承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

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

MulticastSocket

public MulticastSocket() throws IOException

創(chuàng)建一個(gè)多播套接字。

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

創(chuàng)建套接字時(shí),調(diào)用 DatagramSocket#setReuseAddress(boolean) 方法以啟用 SO_REUSEADDR 套接字選項(xiàng)。

Throws:

Throw名稱(chēng) Throw描述
IOException 如果在創(chuàng)建 MulticastSocket 時(shí)發(fā)生 I/O 異常
SecurityException 如果安全管理器存在并且其 checkListen 方法不允許該操作。

MulticastSocket

public MulticastSocket(int port) throws IOException

創(chuàng)建一個(gè)多播套接字并將其綁定到特定端口。

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

創(chuàng)建套接字時(shí),調(diào)用 DatagramSocket#setReuseAddress(boolean) 方法以啟用 SO_REUSEADDR 套接字選項(xiàng)。

參數(shù):

參數(shù)名稱(chēng) 參數(shù)描述
port 使用的端口

Throws:

Throw名稱(chēng) Throw描述
IOException 如果在創(chuàng)建 MulticastSocket 時(shí)發(fā)生 I/O 異常
SecurityException 如果安全管理器存在并且其 checkListen 方法不允許該操作。

MulticastSocket

public MulticastSocket(SocketAddress bindaddr) throws IOException

創(chuàng)建一個(gè)綁定到指定套接字地址的 MulticastSocket。

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

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

創(chuàng)建套接字時(shí),調(diào)用 DatagramSocket#setReuseAddress(boolean) 方法以啟用 SO_REUSEADDR 套接字選項(xiàng)。

參數(shù):

參數(shù)名稱(chēng) 參數(shù)描述
bindaddr 要綁定到的套接字地址,或者對(duì)于未綁定的套接字為 null。

Throws:

Throw名稱(chēng) Throw描述
IOException 如果在創(chuàng)建 MulticastSocket 時(shí)發(fā)生 I/O 異常
SecurityException 如果安全管理器存在并且其 checkListen 方法不允許該操作。

方法詳情

setTTL

@Deprecated public void setTTL(byte ttl) throws IOException

已棄用。 改用 setTimeToLive 方法,該方法使用 int 而不是 byte 作為 ttl 的類(lèi)型。

設(shè)置在此 MulticastSocket 上發(fā)送的多播數(shù)據(jù)包的默認(rèn)生存時(shí)間,以控制多播的范圍。

ttl 是一個(gè)無(wú)符號(hào)的 8 位量,因此必須在 0 <= ttl <= 0xFF 范圍內(nèi)。

參數(shù):

參數(shù)名稱(chēng) 參數(shù)描述
ttl time-to-live

Throws:

Throw名稱(chēng) Throw描述
IOException 如果在設(shè)置默認(rèn)生存時(shí)間值時(shí)發(fā)生 I/O 異常

setTimeToLive

public void setTimeToLive(int ttl) throws IOException

設(shè)置在此 MulticastSocket 上發(fā)送的多播數(shù)據(jù)包的默認(rèn)生存時(shí)間,以控制多播的范圍。

ttl 必須在 0 <= ttl <= 255 范圍內(nèi),否則將引發(fā) IllegalArgumentException。 以 0 的 TTL 發(fā)送的組播數(shù)據(jù)包不會(huì)在網(wǎng)絡(luò)上傳輸,但可以在本地傳送。

參數(shù):

參數(shù)名稱(chēng) 參數(shù)描述
ttl time-to-live

Throws:

Throw名稱(chēng) Throw描述
IOException 如果在設(shè)置默認(rèn)生存時(shí)間值時(shí)發(fā)生 I/O 異常

getTTL

@Deprecated public byte getTTL() throws IOException

已棄用。 改用 getTimeToLive 方法,它返回一個(gè) int 而不是一個(gè)字節(jié)。

獲取在套接字上發(fā)送的多播數(shù)據(jù)包的默認(rèn)生存時(shí)間。

返回:

默認(rèn)生存時(shí)間值

Throws:

Throw名稱(chēng) Throw描述
IOException 如果在獲取默認(rèn)time-to-live值時(shí)發(fā)生 I/O 異常

getTimeToLive

public int getTimeToLive() throws IOException

獲取在套接字上發(fā)送的多播數(shù)據(jù)包的默認(rèn)time-to-live。

返回:

默認(rèn)time-to-live值

Throws:

Throw名稱(chēng) Throw描述
IOException 如果在獲取默認(rèn)生存時(shí)間值時(shí)發(fā)生 I/O 異常

joinGroup

public void joinGroup(InetAddress mcastaddr) throws IOException

加入多播組。 它的行為可能會(huì)受到 setInterface 或 setNetworkInterface 的影響。

如果有安全管理器,則此方法首先調(diào)用其 checkMulticast 方法,并將 mcastaddr 參數(shù)作為其參數(shù)。

參數(shù):

參數(shù)名稱(chēng) 參數(shù)描述
mcastaddr 是要加入的多播地址

Throws:

Throw名稱(chēng) Throw描述
IOException 如果加入錯(cuò)誤或地址不是多播地址。
SecurityException 如果存在安全管理器并且其 checkMulticast 方法不允許加入。

leaveGroup

public void leaveGroup(InetAddress mcastaddr) throws IOException

離開(kāi)一個(gè)多播組。 它的行為可能會(huì)受到 setInterface 或 setNetworkInterface 的影響。

如果有安全管理器,則此方法首先調(diào)用其 checkMulticast 方法,并將 mcastaddr 參數(shù)作為其參數(shù)。

參數(shù):

參數(shù)名稱(chēng) 參數(shù)描述
mcastaddr 是離開(kāi)的組播地址

Throws:

Throw名稱(chēng) Throw描述
IOException 如果離開(kāi)時(shí)出錯(cuò)或地址不是多播地址。
SecurityException 如果存在安全管理器并且其 checkMulticast 方法不允許該操作。

joinGroup

public void joinGroup(SocketAddress mcastaddr, NetworkInterface netIf) throws IOException

在指定接口加入指定的組播組。

如果有安全管理器,則此方法首先調(diào)用其 checkMulticast 方法,并將 mcastaddr 參數(shù)作為其參數(shù)。

參數(shù):

參數(shù)名稱(chēng) 參數(shù)描述
mcastaddr 是要加入的多播地址
netIf 指定接收多播數(shù)據(jù)報(bào)包的本地接口,或 null 以遵循 MulticastSocket#setInterface(InetAddress) 或 MulticastSocket#setNetworkInterface(NetworkInterface) 設(shè)置的接口

Throws:

Throw名稱(chēng) Throw描述
IOException 如果加入錯(cuò)誤或地址不是多播地址。
SecurityException 如果存在安全管理器并且其 checkMulticast 方法不允許加入。
IllegalArgumentException 如果 mcastaddr 為 null 或者是此套接字不支持的 SocketAddress 子類(lèi)

leaveGroup

public void leaveGroup(SocketAddress mcastaddr, NetworkInterface netIf) throws IOException

將組播組留在指定的本地接口上。

如果有安全管理器,則此方法首先調(diào)用其 checkMulticast 方法,并將 mcastaddr 參數(shù)作為其參數(shù)。

參數(shù):

參數(shù)名稱(chēng) 參數(shù)描述
mcastaddr 是要離開(kāi)的多播地址
netIf 指定本地接口或 null 以遵循 MulticastSocket#setInterface(InetAddress) 或 MulticastSocket#setNetworkInterface(NetworkInterface) 設(shè)置的接口

Throws:

Throw名稱(chēng) Throw描述
IOException 如果離開(kāi)時(shí)出錯(cuò)或地址不是多播地址。
SecurityException 如果存在安全管理器并且其 checkMulticast 方法不允許該操作。
IllegalArgumentException 如果 mcastaddr 為 null 或者是此套接字不支持的 SocketAddress 子類(lèi)

setInterface

public void setInterface(InetAddress inf) throws SocketException

設(shè)置行為將受網(wǎng)絡(luò)接口值影響的方法使用的多播網(wǎng)絡(luò)接口。 對(duì)于多宿主主機(jī)很有用。

參數(shù):

參數(shù)名稱(chēng) 參數(shù)描述
inf 網(wǎng)絡(luò)地址

Throws:

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

getInterface

public InetAddress getInterface() throws SocketException

檢索用于多播數(shù)據(jù)包的網(wǎng)絡(luò)接口的地址。

返回:

InetAddress 表示用于多播數(shù)據(jù)包的網(wǎng)絡(luò)接口的地址。

Throws:

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

setNetworkInterface

public void setNetworkInterface(NetworkInterface netIf) throws SocketException

指定在此套接字上發(fā)送的傳出多播數(shù)據(jù)報(bào)的網(wǎng)絡(luò)接口。

參數(shù):

參數(shù)名稱(chēng) 參數(shù)描述
netIf 該接口

Throws:

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

getNetworkInterface

public NetworkInterface getNetworkInterface() throws SocketException

獲取組播網(wǎng)絡(luò)接口集。

返回:

當(dāng)前設(shè)置的多播網(wǎng)絡(luò)接口

Throws:

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

setLoopbackMode

public void setLoopbackMode(boolean disable) throws SocketException

禁用/啟用多播數(shù)據(jù)報(bào)的本地環(huán)回 該選項(xiàng)被平臺(tái)的網(wǎng)絡(luò)代碼用作設(shè)置多播數(shù)據(jù)是否將環(huán)回本地套接字的提示。

因?yàn)檫@個(gè)選項(xiàng)是一個(gè)提示,所以想要驗(yàn)證設(shè)置的環(huán)回模式的應(yīng)用程序應(yīng)該調(diào)用 getLoopbackMode()

參數(shù):

參數(shù)名稱(chēng) 參數(shù)描述
disable true 禁用 LoopbackMode

Throws:

Throw名稱(chēng) Throw描述
SocketException 如果在設(shè)置值時(shí)發(fā)生錯(cuò)誤

getLoopbackMode

public boolean getLoopbackMode() throws SocketException

獲取組播數(shù)據(jù)報(bào)本地環(huán)回的設(shè)置。

返回:

如果 LoopbackMode 已被禁用,則為 true

Throws:

Throw名稱(chēng) Throw描述
SocketException 如果獲取值時(shí)發(fā)生錯(cuò)誤

send

@Deprecated public void send(DatagramPacket p, byte ttl) throws IOException

已棄用。請(qǐng)改用以下代碼或其等效代碼:...... int ttl = mcastSocket.getTimeToLive(); mcastSocket.setTimeToLive(newttl); mcastSocket.send(p); mcastSocket.setTimeToLive(ttl); ……

將數(shù)據(jù)報(bào)包發(fā)送到目的地,其 TTL(生存時(shí)間)不是套接字的默認(rèn)值。這種方法只需要在需要特定 TTL 的情況下使用;否則最好在套接字上設(shè)置一次 TTL,并為所有數(shù)據(jù)包使用該默認(rèn) TTL。此方法不會(huì)更改套接字的默認(rèn) TTL。它的行為可能會(huì)受到 setInterface 的影響。

如果有安全管理器,此方法首先執(zhí)行一些安全檢查。首先,如果 p.getAddress().isMulticastAddress() 為真,則此方法以 p.getAddress() 和 ttl 作為其參數(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ù)名稱(chēng) 參數(shù)描述
p 是要發(fā)送的數(shù)據(jù)包。 數(shù)據(jù)包應(yīng)包含目標(biāo)多播 IP 地址和要發(fā)送的數(shù)據(jù)。 無(wú)需成為組的成員即可將數(shù)據(jù)包發(fā)送到目標(biāo)多播地址。
ttl 多播數(shù)據(jù)包的可選生存時(shí)間。 默認(rèn) ttl 為 1。

Throws:

Throw名稱(chēng) Throw描述
IOException 如果發(fā)生錯(cuò)誤,即設(shè)置 ttl 時(shí)出錯(cuò),則引發(fā)。
SecurityException 如果存在安全管理器并且其 checkMulticast 或 checkConnect 方法不允許發(fā)送。
以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)