使用MulticastSocket實現(xiàn)多點廣播
?
DatagramSocket只允許數(shù)據(jù)報發(fā)送給指定的目標(biāo)地址,而MulticastSocket可以將數(shù)據(jù)報以廣播的方式發(fā)送到多個客戶端
?
若要使用多點廣播,則需要讓一個數(shù)據(jù)報標(biāo)有一組目標(biāo)主機(jī)地址,當(dāng)數(shù)據(jù)報發(fā)出后,整個組的所有所有主機(jī)都能收到該數(shù)據(jù)報。IP多點廣播(或多點發(fā)送)實現(xiàn)了將單一信息發(fā)送到多個接受者的廣播,其思想是設(shè)置一組特殊網(wǎng)絡(luò)地址作為多點廣播地址,每一個多點廣播地址都被看做一個組,當(dāng)客戶端需要發(fā)送、接收廣播信息時,加入到改組即可。
MulticastSocket既可以將數(shù)據(jù)報發(fā)送到多點廣播地址,也可以接收其他主機(jī)的廣播信息。
?
?
? ? MulticastSocket有點像DatagramSocket,事實上MulitcastSocket是DatagramSocket的一個子類,當(dāng)要發(fā)送一個數(shù)據(jù)報時,可以使用隨機(jī)端口創(chuàng)建一個MulticastSocket,也可以在指定端口創(chuàng)建MulticastSocket。MulticastSocket提供了如下3個構(gòu)造器。
1、MulticastSocket():使用本機(jī)默認(rèn)地址、隨機(jī)端口來創(chuàng)建MulticastSocket對象
2、MulticastSocket(int portNumber)使用本機(jī)默認(rèn)地址、指定端口來創(chuàng)建對象
3、MulticastSocket(SocketAddress bindaddr):使用本機(jī)指定IP地址、指定端口來創(chuàng)建對象
?
? ? 創(chuàng)建MulticastSocket對象后,還需要將該MulticastSocket加入到指定的多點廣播地址,MulticastSocket使用joinGroup()方法加入指定組;使用leaveGroup()方法脫離一個組。
1、joinGroup(InetAddress multicastAddr):將該MulticastSocket加入指定的多點廣播地址。
2、leaveGroup(InetAddress multicastAddr):讓該MulticastSocket離開指定的多點廣播地址。
?
應(yīng)用程序只將數(shù)據(jù)報包發(fā)送給組播地址,路由器將確保包被發(fā)送到改組播組中的所有主機(jī)
。?
組播地址:
稱為組播組的
一組主機(jī)所共享的地址
。組播地址的范圍在224.0.0.0---?
239.255.255.255之間(都為D類地址 1110開頭)。?
備注:如果現(xiàn)在有三臺機(jī)器A、B、C,三臺機(jī)器IP地址都不一樣,A\B為server監(jiān)聽廣播消息,C為客戶端發(fā)送廣播消息, 個人理解 是將A、B兩臺機(jī)器的MulticastSocket對象綁定在組播地址中的其中一個,然后C客戶端發(fā)送消息的組播地址一致,則A、B就能夠接收C發(fā)送的消息。
?
?
如果MulticastSocket用于接收信息則使用默認(rèn)地址和隨機(jī)端口即可,但是如果用來接收信息,則必須要指定端口,否則發(fā)送方無法確定發(fā)送數(shù)據(jù)報的目標(biāo)端口 。
?
package hb.brodcast; import java.net.DatagramPacket; import java.net.InetAddress; import java.net.MulticastSocket; public class MulticastListener { private int port; private String host; public MulticastListener(String host, int port) { this.host = host; this.port = port; } public void listen() { byte[] data = new byte[256]; try { InetAddress ip = InetAddress.getByName(this.host); MulticastSocket ms = new MulticastSocket(this.port); ms.joinGroup(ip); DatagramPacket packet = new DatagramPacket(data, data.length); //receive()是阻塞方法,會等待客戶端發(fā)送過來的信息 ms.receive(packet); String message = new String(packet.getData(), 0, packet.getLength()); System.out.println(message); ms.close(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { int port = 1234; String host = "224.0.0.1"; MulticastListener ml = new MulticastListener(host, port); while (true) { ml.listen(); } } }
?
package hb.brodcast; import java.net.DatagramPacket; import java.net.InetAddress; import java.net.MulticastSocket; public class MulticastSender { private int port; private String host; private String data; public MulticastSender(String data, String host, int port) { this.data = data; this.host = host; this.port = port; } public void send() { try { InetAddress ip = InetAddress.getByName(this.host); DatagramPacket packet = new DatagramPacket(this.data.getBytes(), this.data.length(), ip, this.port); MulticastSocket ms = new MulticastSocket(); ms.send(packet); ms.close(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { int port = 1234; String host = "224.0.0.1"; String data = "hello world."; System.out.println(data); MulticastSender ms = new MulticastSender(data, host, port); ms.send(); } }
?
? ? MulticastSocket用于發(fā)送、接收數(shù)據(jù)報的方法與DatagramSocket完全一樣。但MulticastSocket比DatagramSocket多了一個 setTimeToLive(int ttl)方法,該ttl參數(shù)用于設(shè)置數(shù)據(jù)報最多可以跨過多少個網(wǎng)絡(luò) ,當(dāng)ttl的值為0時,指定數(shù)據(jù)報應(yīng)停留在本地主機(jī);當(dāng)ttl的值為1時,指定數(shù)據(jù)報發(fā)送到本地局域網(wǎng);當(dāng)ttl的值為32時,意味著只能發(fā)送到本站點的網(wǎng)絡(luò)上;當(dāng)ttl的值為64時,意味著數(shù)據(jù)報應(yīng)保留在本地區(qū);當(dāng)ttl的值為128時,意味著數(shù)據(jù)報應(yīng)保留在本大洲;當(dāng)ttl的值為255時,意味著數(shù)據(jù)報可發(fā)送到所有地方; 在默認(rèn)情況下,該ttl的值為1 。
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
