多播(Multicast)的原理与java代码

多播(multicast): 可以进行 ‘一对一’ 或者 ‘一对多’ 的 传输。

        使用 D 类 IP 地址: (224.0.0.0, 239.255.255.255] 

        多播的存在意义: 比单播高效,比广播精准

单播,多播,广播的对比:

单播Unicast

广播Broadcast

多播Multicast

Mechanism

机制上:

sender传输给广播域(broadcast domain)中的所有receiver

sender传输给多播组(multicast group)中 receiver

Bandwidth

带宽上:

一对一的传输方式可能会出现严重的网络拥塞

多播将单个信息发送给加入’多播组’中的接收者。(只传输一个数据包会显著减少通信量,从而最大限度地利用网络带宽。)

Protocol

协议上:

单播应用程序可以在传输层使用TCP或UDP

多播应用程序使用UDP。

(因此,应用层必须为多播操作提供可靠性数据传输机制,例如序列号、计时器和重传。)

Sender 发送方代码:

import java.io.*;
import java.net.*;
import java.util.*;
public class MultiC_S {
	public static void main(String[] ar) throws IOException {
		Scanner sc = new Scanner(System.in);
		System.out.print("Message = ");
		String str = sc.next();
		
		InetAddress ia = InetAddress.getByName("239.255.255.255");
		DatagramPacket dp = new DatagramPacket(str.getBytes(), str.getBytes().length, 
				ia, 10000); //数值(10000)与receiver中一致
		MulticastSocket ms = new MulticastSocket();
		ms.send(dp);
		ms.close();
	}
}

Receiver 接收方代码:

import java.io.*;
import java.net.*;
import java.util.*;
public class MultiC_R {
	public static void main(String[] ar) throws IOException {
		DatagramPacket dp = new DatagramPacket(new byte[1000], 1000);
		
		MulticastSocket ms = new MulticastSocket(10000); //数值与sender中一致
		InetAddress ia = InetAddress.getByName("239.255.255.255");
		
		ms.joinGroup(ia);	//加入多播组
		ms.receive(dp);
		ms.leaveGroup(ia);
		ms.close();
		
		System.out.println("Sender = " + dp.getAddress().getHostAddress());
		System.out.print("Message = " + new String(dp.getData()));
		
	}
}

cmd运行结果

Java 使用 MulticastSocket 类创建 UDP 多播套接字以接收发送到多播 IP 地址的数据报包。以下是一个接收 UDP 多播消息的 Java 代码示例: ``` import java.net.DatagramPacket; import java.net.InetAddress; import java.net.MulticastSocket; public class UDPMulticastReceiver { public static void main(String[] args) throws Exception { int mcPort = 12345; String mcIPStr = "230.1.1.1"; MulticastSocket mcSocket = null; InetAddress mcIPAddress = null; mcIPAddress = InetAddress.getByName(mcIPStr); mcSocket = new MulticastSocket(mcPort); System.out.println("Multicast Receiver running at:" + mcSocket.getLocalSocketAddress()); mcSocket.joinGroup(mcIPAddress); DatagramPacket packet = new DatagramPacket(new byte[1024], 1024); System.out.println("Waiting for a multicast message..."); mcSocket.receive(packet); String msg = new String(packet.getData(), packet.getOffset(), packet.getLength()); System.out.println("[Multicast Receiver] Received:" + msg); mcSocket.leaveGroup(mcIPAddress); mcSocket.close(); } } ``` 以下是一个发送 UDP 多播消息的 Java 代码示例: ``` import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UDPMulticastSender { public static void main(String[] args) throws Exception { int mcPort = 12345; String mcIPStr = "230.1.1.1"; DatagramSocket udpSocket = new DatagramSocket(); InetAddress mcIPAddress = InetAddress.getByName(mcIPStr); byte[] msg = "Hello".getBytes(); DatagramPacket packet = new DatagramPacket(msg, msg.length); packet.setAddress(mcIPAddress); packet.setPort(mcPort); udpSocket.send(packet); System.out.println("Sent a multicast message."); System.out.println("Exiting application"); udpSocket.close(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值