亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java 單播、廣播、組播詳解及實(shí)例代碼

 更新時間:2017年02月14日 11:33:52   投稿:lqh  
這篇文章主要介紹了java 單播、廣播、組播詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下

java 單播、廣播、組播詳解及實(shí)例代碼

在當(dāng)前網(wǎng)絡(luò)通信中(TCP/IP也不例外)有三種通信模式:單播、廣播、組播(又叫多播, 個人感覺叫多播描述的有點(diǎn)不恰當(dāng)),其中多播出現(xiàn)的時間最晚,但同時具備單播和廣播的優(yōu)點(diǎn),最具有發(fā)展前景。   

一.通信方式分類:   

1.單播:單臺主機(jī)與單臺主機(jī)之間的通信;   

2.廣播:單臺主機(jī)與網(wǎng)絡(luò)中所有主機(jī)的通信;   

3.組播:單臺主機(jī)與選定的一組主機(jī)的通信;        

二.單播:   

單播是網(wǎng)絡(luò)通信中最常見的,網(wǎng)絡(luò)節(jié)點(diǎn)之間的通信 就好像是人們之間的對話一樣。如果一個人對另外一個人說話,   

那么用網(wǎng)絡(luò)技術(shù)的術(shù)語來描述就是“單播”,此時信息的接收和傳遞只在兩個節(jié)點(diǎn)之間進(jìn)行。   

1. 單播的優(yōu)點(diǎn):   

(1)服務(wù)器以及響應(yīng)客戶端的請求;   

(2)服務(wù)器能針對每個客戶端的不同請求發(fā)送不同的響應(yīng),容易顯示個性化服務(wù);   

2. 單播的缺點(diǎn):   

(1)服務(wù)器針對每個客戶機(jī)發(fā)送數(shù)據(jù)流,服務(wù)器流量=客戶機(jī)數(shù)量×客戶機(jī)流量;在客戶數(shù)量大、每個客戶機(jī)流量大的流媒體應(yīng)用中服務(wù)器不堪重負(fù);   

3. 應(yīng)用場景:   

單播在網(wǎng)絡(luò)中得到了廣泛的應(yīng)用,網(wǎng)絡(luò)上絕大部分的數(shù)據(jù)都 是以單播的形式傳輸?shù)?。例如:收發(fā)電子郵件、游覽網(wǎng)頁時,必須與郵件服務(wù)器、   

服務(wù)器建立連接,此時使用的就是單播通信方式;   

三.廣播:   

“廣播”可以比方為:一個人通過廣播喇叭對在場的全體說話(他才不管你是否樂意聽)。換句話說: 廣播是一臺主機(jī)對某一個網(wǎng)絡(luò)上的所有主機(jī)發(fā)送數(shù)據(jù)報包。   

這個網(wǎng)絡(luò)可能是網(wǎng)絡(luò),也可能時子網(wǎng),還有可能是所有子網(wǎng)。   

廣播有兩類:本地廣播和定向廣播:   

定向廣播:將數(shù)據(jù)報包發(fā)送到本網(wǎng)絡(luò)之外的特定網(wǎng)絡(luò)的所有主機(jī),然而,由于互聯(lián)網(wǎng)上的大部分路由器都不轉(zhuǎn)發(fā)定向廣播消息,所以這里不深入介紹了  

本地廣播:將數(shù)據(jù)報包發(fā)送到本地網(wǎng)絡(luò)的所有主機(jī),IPv4的本地廣播地址為“255.255.255.255”,路由器不會轉(zhuǎn)發(fā)此廣播;   

1.廣播的優(yōu)點(diǎn):   

(1)通信的效率高,信息一下子就可以傳遞到某一個網(wǎng)絡(luò)上的所有主機(jī)。   

(2)由于服務(wù)器不用向每個客戶端單獨(dú)發(fā)送數(shù)據(jù),所以服務(wù)器流量比較負(fù)載低;   

2.廣播的缺點(diǎn):   

(1)非常占用網(wǎng)絡(luò)的帶寬;   

(2)缺乏針對性,也不管主機(jī)是否真的需要接收該數(shù)據(jù), 就強(qiáng)制的接收數(shù)據(jù);   

3.應(yīng)用場景:   

(1)有線電視就是典型的廣播型網(wǎng)絡(luò)  

四.組播:   

”組播“可以比方為:你對著大街喊:”是男人的來一下,一人發(fā)一百塊”,那么男的過來,女就不會過來,因?yàn)闆]有錢發(fā)她不理你(組播:其中所有的男生就是一個組),    換句話說: 組播是一臺主機(jī)向指定的一組主機(jī)發(fā)送數(shù)據(jù)報包,因?yàn)槿绻捎脝尾シ绞?,逐個節(jié)點(diǎn)傳輸,有多少個目標(biāo)節(jié)點(diǎn),就會有多少次傳送過程,這種方式顯然效率 極低,是不可取  的;如果采用不區(qū)分目標(biāo)、全部發(fā)送的廣播方式,雖然一次可以傳送完數(shù)據(jù),但是顯然達(dá)不到區(qū)分特定數(shù)據(jù)接收對象的目的,又會占用網(wǎng)絡(luò)帶寬。采用組播方式,既可以 實(shí)現(xiàn)一次傳送所   

有目標(biāo)節(jié)點(diǎn)的數(shù)據(jù),也可以達(dá)到只對特定對象傳送數(shù)據(jù)的目的。   

IP網(wǎng)絡(luò)的組播一般通過組播IP地址來實(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ù)報包的效率,與廣播相比,減少了網(wǎng)絡(luò)流量;   

2.組播的缺點(diǎn):  

  (1)與單播協(xié)議相比沒有糾錯機(jī)制,發(fā)生丟包錯包后難以彌補(bǔ),但可以通過一定的容錯機(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)用程序主要通過MulticastSocket實(shí)例進(jìn)行通信,它是DatagramSocket的是一個子類, 
   * 其中包含了一些額外的可以控制多播的屬性. 
   * 
   * 注意: 
   * 
   * 多播數(shù)據(jù)報包實(shí)際上可以通過DatagramSocket發(fā)送,只需要簡單地指定一個多播地址。 
   * 我們這里使用MulticastSocket,是因?yàn)樗哂蠨atagramSocket沒有的能力 
   */ 
  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ù)報包,可以不加入多播組; 如果是接收數(shù)據(jù)報包,必須加入多播組; 這里是接收數(shù)據(jù)報包,所以必須加入多播組; 
   */ 
  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)); 
  } 
 
 } 
} 

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

最新評論