java 單播、廣播、組播詳解及實(shí)例代碼
java 單播、廣播、組播詳解及實(shí)例代碼
在當(dāng)前網(wǎng)絡(luò)通信中(TCP/IP也不例外)有三種通信模式:?jiǎn)尾?、廣播、組播(又叫多播, 個(gè)人感覺(jué)叫多播描述的有點(diǎn)不恰當(dāng)),其中多播出現(xiàn)的時(shí)間最晚,但同時(shí)具備單播和廣播的優(yōu)點(diǎn),最具有發(fā)展前景。
一.通信方式分類:
1.單播:?jiǎn)闻_(tái)主機(jī)與單臺(tái)主機(jī)之間的通信;
2.廣播:?jiǎn)闻_(tái)主機(jī)與網(wǎng)絡(luò)中所有主機(jī)的通信;
3.組播:?jiǎn)闻_(tái)主機(jī)與選定的一組主機(jī)的通信;
二.單播:
單播是網(wǎng)絡(luò)通信中最常見(jiàn)的,網(wǎng)絡(luò)節(jié)點(diǎn)之間的通信 就好像是人們之間的對(duì)話一樣。如果一個(gè)人對(duì)另外一個(gè)人說(shuō)話,
那么用網(wǎng)絡(luò)技術(shù)的術(shù)語(yǔ)來(lái)描述就是“單播”,此時(shí)信息的接收和傳遞只在兩個(gè)節(jié)點(diǎn)之間進(jìn)行。
1. 單播的優(yōu)點(diǎn):
(1)服務(wù)器以及響應(yīng)客戶端的請(qǐng)求;
(2)服務(wù)器能針對(duì)每個(gè)客戶端的不同請(qǐng)求發(fā)送不同的響應(yīng),容易顯示個(gè)性化服務(wù);
2. 單播的缺點(diǎn):
(1)服務(wù)器針對(duì)每個(gè)客戶機(jī)發(fā)送數(shù)據(jù)流,服務(wù)器流量=客戶機(jī)數(shù)量×客戶機(jī)流量;在客戶數(shù)量大、每個(gè)客戶機(jī)流量大的流媒體應(yīng)用中服務(wù)器不堪重負(fù);
3. 應(yīng)用場(chǎng)景:
單播在網(wǎng)絡(luò)中得到了廣泛的應(yīng)用,網(wǎng)絡(luò)上絕大部分的數(shù)據(jù)都 是以單播的形式傳輸?shù)摹@纾菏瞻l(fā)電子郵件、游覽網(wǎng)頁(yè)時(shí),必須與郵件服務(wù)器、
服務(wù)器建立連接,此時(shí)使用的就是單播通信方式;
三.廣播:
“廣播”可以比方為:一個(gè)人通過(guò)廣播喇叭對(duì)在場(chǎng)的全體說(shuō)話(他才不管你是否樂(lè)意聽(tīng))。換句話說(shuō): 廣播是一臺(tái)主機(jī)對(duì)某一個(gè)網(wǎng)絡(luò)上的所有主機(jī)發(fā)送數(shù)據(jù)報(bào)包。
這個(gè)網(wǎng)絡(luò)可能是網(wǎng)絡(luò),也可能時(shí)子網(wǎng),還有可能是所有子網(wǎng)。
廣播有兩類:本地廣播和定向廣播:
定向廣播:將數(shù)據(jù)報(bào)包發(fā)送到本網(wǎng)絡(luò)之外的特定網(wǎng)絡(luò)的所有主機(jī),然而,由于互聯(lián)網(wǎng)上的大部分路由器都不轉(zhuǎn)發(fā)定向廣播消息,所以這里不深入介紹了
本地廣播:將數(shù)據(jù)報(bào)包發(fā)送到本地網(wǎng)絡(luò)的所有主機(jī),IPv4的本地廣播地址為“255.255.255.255”,路由器不會(huì)轉(zhuǎn)發(fā)此廣播;
1.廣播的優(yōu)點(diǎn):
(1)通信的效率高,信息一下子就可以傳遞到某一個(gè)網(wǎng)絡(luò)上的所有主機(jī)。
(2)由于服務(wù)器不用向每個(gè)客戶端單獨(dú)發(fā)送數(shù)據(jù),所以服務(wù)器流量比較負(fù)載低;
2.廣播的缺點(diǎn):
(1)非常占用網(wǎng)絡(luò)的帶寬;
(2)缺乏針對(duì)性,也不管主機(jī)是否真的需要接收該數(shù)據(jù), 就強(qiáng)制的接收數(shù)據(jù);
3.應(yīng)用場(chǎng)景:
(1)有線電視就是典型的廣播型網(wǎng)絡(luò)
四.組播:
”組播“可以比方為:你對(duì)著大街喊:”是男人的來(lái)一下,一人發(fā)一百塊”,那么男的過(guò)來(lái),女就不會(huì)過(guò)來(lái),因?yàn)闆](méi)有錢發(fā)她不理你(組播:其中所有的男生就是一個(gè)組), 換句話說(shuō): 組播是一臺(tái)主機(jī)向指定的一組主機(jī)發(fā)送數(shù)據(jù)報(bào)包,因?yàn)槿绻捎脝尾シ绞?,逐個(gè)節(jié)點(diǎn)傳輸,有多少個(gè)目標(biāo)節(jié)點(diǎn),就會(huì)有多少次傳送過(guò)程,這種方式顯然效率 極低,是不可取 的;如果采用不區(qū)分目標(biāo)、全部發(fā)送的廣播方式,雖然一次可以傳送完數(shù)據(jù),但是顯然達(dá)不到區(qū)分特定數(shù)據(jù)接收對(duì)象的目的,又會(huì)占用網(wǎng)絡(luò)帶寬。采用組播方式,既可以 實(shí)現(xiàn)一次傳送所
有目標(biāo)節(jié)點(diǎn)的數(shù)據(jù),也可以達(dá)到只對(duì)特定對(duì)象傳送數(shù)據(jù)的目的。
IP網(wǎng)絡(luò)的組播一般通過(guò)組播IP地址來(lái)實(shí)現(xiàn)。組播IP地址就是D類IP地址,即224.0.0.0至239.255.255.255之間的IP地址。
1.組播的優(yōu)點(diǎn):
(1)具備廣播所具備的所有優(yōu)點(diǎn);
(2)與單播相比,提供了發(fā)送數(shù)據(jù)報(bào)包的效率,與廣播相比,減少了網(wǎng)絡(luò)流量;
2.組播的缺點(diǎn):
(1)與單播協(xié)議相比沒(méi)有糾錯(cuò)機(jī)制,發(fā)生丟包錯(cuò)包后難以彌補(bǔ),但可以通過(guò)一定的容錯(cuò)機(jī)制和QOS加以彌補(bǔ);
五.應(yīng)用實(shí)例:
1.UDP單播的例子
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
// 客戶端
public class ClientTest
{
private static final int MAXRECEIVED = 255;
public static void main(String[] args) throws IOException
{
byte[] msg = new String("connect test successfully!!!").getBytes();
DatagramSocket client = new DatagramSocket();
InetAddress inetAddr = InetAddress.getLocalHost();
SocketAddress socketAddr = new InetSocketAddress(inetAddr, 8888);
DatagramPacket sendPacket = new DatagramPacket(msg, msg.length,
socketAddr);
client.send(sendPacket);
client.close();
}
}
服務(wù)端:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.util.Arrays;
//服務(wù)端
public class ServerTest
{
private static final int MAXREV = 255;
public static void main(String[] args) throws IOException
{
DatagramSocket server = new DatagramSocket(8888);
DatagramPacket recvPacket = new DatagramPacket(new byte[MAXREV], MAXREV);
while (true)
{
server.receive(recvPacket);
byte[] receiveMsg = Arrays.copyOfRange(recvPacket.getData(),
recvPacket.getOffset(),
recvPacket.getOffset() + recvPacket.getLength());
System.out.println("Handing at client "
+ recvPacket.getAddress().getHostName() + " ip "
+ recvPacket.getAddress().getHostAddress());
System.out.println("Server Receive Data:" + new String(receiveMsg));
server.send(recvPacket);
}
}
}
2.UDP廣播的例子
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
//客戶端
public class BroadcastSender
{
public static void main(String[] args) throws IOException
{
byte[] msg = new String("connection successfully!!!").getBytes();
/*
* 在Java UDP中單播與廣播的代碼是相同的,要實(shí)現(xiàn)具有廣播功能的程序只需要使用廣播地址即可, 例如:這里使用了本地的廣播地址
*/
InetAddress inetAddr = InetAddress.getByName("255.255.255.255");
DatagramSocket client = new DatagramSocket();
DatagramPacket sendPack = new DatagramPacket(msg, msg.length, inetAddr,
8888);
client.send(sendPack);
System.out.println("Client send msg complete");
client.close();
}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.util.Arrays;
//服務(wù)端
public class BroadcastReceive
{
public static void main(String[] args) throws IOException
{
DatagramPacket receive = new DatagramPacket(new byte[1024], 1024);
DatagramSocket server = new DatagramSocket(8888);
System.out.println("---------------------------------");
System.out.println("Server current start......");
System.out.println("---------------------------------");
while (true)
{
server.receive(receive);
byte[] recvByte = Arrays.copyOfRange(receive.getData(), 0,
receive.getLength());
System.out.println("Server receive msg:" + new String(recvByte));
}
}
}
3.UDP組播的例子
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
//客戶端
public class MulticastSender
{
public static void main(String[] args) throws IOException
{
int port = 8888;
byte[] msg = "Connection successfully!!!".getBytes();
InetAddress inetRemoteAddr = InetAddress.getByName("224.0.0.5");
/*
* Java UDP組播應(yīng)用程序主要通過(guò)MulticastSocket實(shí)例進(jìn)行通信,它是DatagramSocket的是一個(gè)子類,
* 其中包含了一些額外的可以控制多播的屬性.
*
* 注意:
*
* 多播數(shù)據(jù)報(bào)包實(shí)際上可以通過(guò)DatagramSocket發(fā)送,只需要簡(jiǎn)單地指定一個(gè)多播地址。
* 我們這里使用MulticastSocket,是因?yàn)樗哂蠨atagramSocket沒(méi)有的能力
*/
MulticastSocket client = new MulticastSocket();
DatagramPacket sendPack = new DatagramPacket(msg, msg.length,
inetRemoteAddr, port);
client.send(sendPack);
System.out.println("Client send msg complete");
client.close();
}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.util.Arrays;
//服務(wù)端
public class MulticastReceive
{
public static void main(String[] args) throws IOException
{
InetAddress inetRemoteAddr = InetAddress.getByName("224.0.0.5");
DatagramPacket recvPack = new DatagramPacket(new byte[1024], 1024);
MulticastSocket server = new MulticastSocket(8888);
/*
* 如果是發(fā)送數(shù)據(jù)報(bào)包,可以不加入多播組; 如果是接收數(shù)據(jù)報(bào)包,必須加入多播組; 這里是接收數(shù)據(jù)報(bào)包,所以必須加入多播組;
*/
server.joinGroup(inetRemoteAddr);
System.out.println("---------------------------------");
System.out.println("Server current start......");
System.out.println("---------------------------------");
while (true)
{
server.receive(recvPack);
byte[] recvByte = Arrays.copyOfRange(recvPack.getData(), 0,
recvPack.getLength());
System.out.println("Server receive msg:" + new String(recvByte));
}
}
}
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Java實(shí)時(shí)獲取基金收益項(xiàng)目源碼分享
這篇文章主要介紹了Java實(shí)時(shí)獲取基金收益項(xiàng)目源碼分享,主要包括JAVA爬取天天基金網(wǎng)數(shù)據(jù)使用實(shí)例、應(yīng)用技巧、基本知識(shí)點(diǎn)總結(jié)和需要注意事項(xiàng),需要的朋友可以參考下2021-03-03
Intellij IDEA 如何通過(guò)數(shù)據(jù)庫(kù)表生成帶注解的實(shí)體類(圖文詳細(xì)教程)
這篇文章主要介紹了Intellij IDEA 如何通過(guò)數(shù)據(jù)庫(kù)表生成帶注解的實(shí)體類(圖文詳細(xì)教程),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
Java編程實(shí)現(xiàn)遍歷兩個(gè)MAC地址之間所有MAC的方法
這篇文章主要介紹了Java編程實(shí)現(xiàn)遍歷兩個(gè)MAC地址之間所有MAC的方法,涉及Java針對(duì)MAC的遍歷獲取與字符串轉(zhuǎn)換相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11
SpringBoot詳細(xì)講解通過(guò)自定義classloader加密保護(hù)class文件
這篇文章主要介紹了SpringBoot通過(guò)自定義classloader加密class文件,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
springboot tomcat的maxHttpFormPostSize參數(shù)示例解析
這篇文章主要介紹了springboot tomcat的maxHttpFormPostSize參數(shù)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
JavaEE SpringMyBatis是什么? 它和Hibernate的區(qū)別及如何配置MyBatis
這篇文章主要介紹了JavaEE Spring MyBatis是什么? 它和Hibernate的區(qū)別有哪些?如何配置MyBatis?本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
SpringBoot集成MyBatis的分頁(yè)插件PageHelper實(shí)例代碼
這篇文章主要介紹了SpringBoot集成MyBatis的分頁(yè)插件PageHelper的相關(guān)操作,需要的朋友可以參考下2017-08-08

