鴻蒙OS MulticastSocket

2022-06-10 16:28 更新

MulticastSocket

java.lang.Object

|---java.net.DatagramSocket

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

public class MulticastSocket
extends DatagramSocket

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

多播組由 D 類 IP 地址和標準 UDP 端口號指定。 D 類 IP 地址的范圍為 224.0.0.0 到 239.255.255.255(含)。 地址 224.0.0.0 已保留,不應使用。

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

 // 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);

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

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

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

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

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

方法總結(jié)

修飾符和類型 方法 描述
InetAddress getInterface() 檢索用于多播數(shù)據(jù)包的網(wǎng)絡接口的地址。
boolean getLoopbackMode() 獲取組播數(shù)據(jù)報本地環(huán)回的設置。
NetworkInterface getNetworkInterface() 獲取組播網(wǎng)絡接口集。
int getTimeToLive() 獲取在套接字上發(fā)送的多播數(shù)據(jù)包的默認生存時間。
byte getTTL() 已棄用。 改用 getTimeToLive 方法,它返回一個 int 而不是一個字節(jié)。
void joinGroup(InetAddress mcastaddr) 加入多播組。
void joinGroup(SocketAddress mcastaddr, NetworkInterface netIf) 在指定接口加入指定的組播組。
void leaveGroup(InetAddress mcastaddr) 離開一個多播組。
void leaveGroup(SocketAddress mcastaddr, NetworkInterface netIf) 將組播組留在指定的本地接口上。
void send(DatagramPacket p, byte ttl) 已棄用。 請改用以下代碼或其等效代碼:...... int ttl = mcastSocket.getTimeToLive(); mcastSocket.setTimeToLive(newttl); mcastSocket.send(p); mcastSocket.setTimeToLive(ttl); ……
void setInterface(InetAddress inf) 設置行為將受網(wǎng)絡接口值影響的方法使用的多播網(wǎng)絡接口。
void setLoopbackMode(boolean disable) 禁用/啟用多播數(shù)據(jù)報的本地環(huán)回 該選項被平臺的網(wǎng)絡代碼用作設置多播數(shù)據(jù)是否將環(huán)回本地套接字的提示。
void setNetworkInterface(NetworkInterface netIf) 指定在此套接字上發(fā)送的傳出多播數(shù)據(jù)報的網(wǎng)絡接口。
void setTimeToLive(int ttl) 設置在此 MulticastSocket 上發(fā)送的多播數(shù)據(jù)包的默認生存時間,以控制多播的范圍。
void setTTL(byte ttl) 已棄用。 改用 setTimeToLive 方法,該方法使用 int 而不是 byte 作為 ttl 的類型。
從類 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
從類 java.lang.Object 繼承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

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

MulticastSocket

public MulticastSocket() throws IOException

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

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

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

Throws:

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

MulticastSocket

public MulticastSocket(int port) throws IOException

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

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

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

參數(shù):

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

Throws:

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

MulticastSocket

public MulticastSocket(SocketAddress bindaddr) throws IOException

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

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

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

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

參數(shù):

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

Throws:

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

方法詳情

setTTL

@Deprecated public void setTTL(byte ttl) throws IOException

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

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

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

參數(shù):

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

Throws:

Throw名稱 Throw描述
IOException 如果在設置默認生存時間值時發(fā)生 I/O 異常

setTimeToLive

public void setTimeToLive(int ttl) throws IOException

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

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

參數(shù):

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

Throws:

Throw名稱 Throw描述
IOException 如果在設置默認生存時間值時發(fā)生 I/O 異常

getTTL

@Deprecated public byte getTTL() throws IOException

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

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

返回:

默認生存時間值

Throws:

Throw名稱 Throw描述
IOException 如果在獲取默認time-to-live值時發(fā)生 I/O 異常

getTimeToLive

public int getTimeToLive() throws IOException

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

返回:

默認time-to-live值

Throws:

Throw名稱 Throw描述
IOException 如果在獲取默認生存時間值時發(fā)生 I/O 異常

joinGroup

public void joinGroup(InetAddress mcastaddr) throws IOException

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

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

參數(shù):

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

Throws:

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

leaveGroup

public void leaveGroup(InetAddress mcastaddr) throws IOException

離開一個多播組。 它的行為可能會受到 setInterface 或 setNetworkInterface 的影響。

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

參數(shù):

參數(shù)名稱 參數(shù)描述
mcastaddr 是離開的組播地址

Throws:

Throw名稱 Throw描述
IOException 如果離開時出錯或地址不是多播地址。
SecurityException 如果存在安全管理器并且其 checkMulticast 方法不允許該操作。

joinGroup

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

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

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

參數(shù):

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

Throws:

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

leaveGroup

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

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

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

參數(shù):

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

Throws:

Throw名稱 Throw描述
IOException 如果離開時出錯或地址不是多播地址。
SecurityException 如果存在安全管理器并且其 checkMulticast 方法不允許該操作。
IllegalArgumentException 如果 mcastaddr 為 null 或者是此套接字不支持的 SocketAddress 子類

setInterface

public void setInterface(InetAddress inf) throws SocketException

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

參數(shù):

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

Throws:

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

getInterface

public InetAddress getInterface() throws SocketException

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

返回:

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

Throws:

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

setNetworkInterface

public void setNetworkInterface(NetworkInterface netIf) throws SocketException

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

參數(shù):

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

Throws:

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

getNetworkInterface

public NetworkInterface getNetworkInterface() throws SocketException

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

返回:

當前設置的多播網(wǎng)絡接口

Throws:

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

setLoopbackMode

public void setLoopbackMode(boolean disable) throws SocketException

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

因為這個選項是一個提示,所以想要驗證設置的環(huán)回模式的應用程序應該調(diào)用 getLoopbackMode()

參數(shù):

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

Throws:

Throw名稱 Throw描述
SocketException 如果在設置值時發(fā)生錯誤

getLoopbackMode

public boolean getLoopbackMode() throws SocketException

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

返回:

如果 LoopbackMode 已被禁用,則為 true

Throws:

Throw名稱 Throw描述
SocketException 如果獲取值時發(fā)生錯誤

send

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

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

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

如果有安全管理器,此方法首先執(zhí)行一些安全檢查。首先,如果 p.getAddress().isMulticastAddress() 為真,則此方法以 p.getAddress() 和 ttl 作為其參數(shù)調(diào)用安全管理器的 checkMulticast 方法。如果該表達式的評估結(jié)果為假,則此方法將使用參數(shù) p.getAddress().getHostAddress() 和 p.getPort() 調(diào)用安全管理器的 checkConnect 方法。如果不允許該操作,則對安全管理器方法的每次調(diào)用都可能導致 SecurityException。

參數(shù):

參數(shù)名稱 參數(shù)描述
p 是要發(fā)送的數(shù)據(jù)包。 數(shù)據(jù)包應包含目標多播 IP 地址和要發(fā)送的數(shù)據(jù)。 無需成為組的成員即可將數(shù)據(jù)包發(fā)送到目標多播地址。
ttl 多播數(shù)據(jù)包的可選生存時間。 默認 ttl 為 1。

Throws:

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號