W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
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ù) | 描述 |
---|---|
MulticastSocket() | 創(chuàng)建一個(gè)多播套接字。 |
MulticastSocket(int port) | 創(chuàng)建一個(gè)多播套接字并將其綁定到特定端口。 |
MulticastSocket(SocketAddress bindaddr) | 創(chuàng)建一個(gè)綁定到指定套接字地址的 MulticastSocket。 |
修飾符和類(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 |
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 方法不允許該操作。 |
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 方法不允許該操作。 |
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 方法不允許該操作。 |
@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 異常 |
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 異常 |
@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 異常 |
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 異常 |
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 方法不允許加入。 |
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 方法不允許該操作。 |
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) |
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) |
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ò)誤。 |
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ò)誤。 |
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ò)誤。 |
public NetworkInterface getNetworkInterface() throws SocketException
獲取組播網(wǎng)絡(luò)接口集。
返回:
當(dāng)前設(shè)置的多播網(wǎng)絡(luò)接口
Throws:
Throw名稱(chēng) | Throw描述 |
---|---|
SocketException | 如果底層協(xié)議有錯(cuò)誤,例如 TCP 錯(cuò)誤。 |
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ò)誤 |
public boolean getLoopbackMode() throws SocketException
獲取組播數(shù)據(jù)報(bào)本地環(huán)回的設(shè)置。
返回:
如果 LoopbackMode 已被禁用,則為 true
Throws:
Throw名稱(chēng) | Throw描述 |
---|---|
SocketException | 如果獲取值時(shí)發(fā)生錯(cuò)誤 |
@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ā)送。 |
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話(huà):173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: