UDP广播与多播

UDP广播与多播

作者:legend

使用UDP协议进行信息的传输之前不需要建议连接。换句话说就是客户端向服务器发送信息,客户端只需要给出服务器的ip地址和端口号,然后将信息封装到一个待发送的报文中并且发送出去。至于服务器端是否存在,或者能否收到该报文,客户端根本不用管。

通常我们讨论的udp的程序都是一对一的单播程序。本章将讨论一对多的服务:广播(broadcast)、多播(multicast)。对于广播,网络中的所有主机都会接收一份数据副本。对于多播,消息只是发送到一个多播地址,网络知识将数据分发给哪些表示想要接收发送到该多播地址的数据的主机。总得来说,只有UDP套接字允许广播或多播。

UDP广播

广播UDP与单播UDP的区别就是IP地址不同,广播使用广播地址255.255.255.255,将消息发送到在同一广播网络上的每个主机。值得强调的是:本地广播信息是不会被路由器转发。当然这是十分容易理解的,因为如果路由器转发了广播信息,那么势必会引起网络瘫痪。这也是为什么IP协议的设计者故意没有定义互联网范围的广播机制。

广播地址通常用于在网络游戏中处于同一本地网络的玩家之间交流状态信息等。广播就不在写演示程序了,读者可以将ECHO程序的ip地址改为广播地址即可。

其实广播顾名思义,就是想局域网内所有的人说话,但是广播还是要指明接收者的端口号的,因为不可能接受者的所有端口都来收听广播。

UDP多播

同样的UDP多播也要指明接受者的端口号,而且与广播相似的是多播与单播之间的区别还在于地址。ipv4中的多播地址范围是:224.0.0.0到239.255.255.255。在JAVA中,多播一样十分好实现,要实现多播,就要用到MulticastSocket类,其实该类就是DatagramSocket的子类,在使用时除了多播自己的一些特性外,把它当做DatagramSocket类使用就可以了。下面将给出一个简单的多播接受数据的例子:

package cn.edu.heut.zcl.multicast;

 

import java.net.DatagramPacket;

import java.net.InetAddress;

import java.net.MulticastSocket;

 

public class UDPMulticastServer {

         final static int RECEIVE_LENGTH = 1024;

         static String multicastHost="224.0.0.1";

         static int localPort = 9998;

         public static void main(String[] args) throws Exception {                   

                   InetAddress receiveAddress =InetAddress.getByName(multicastHost);

                   if(!receiveAddress.isMulticastAddress()){//测试是否为多播地址

                            throw new Exception("请使用多播地址");

                   }

                   int port = localPort;

                   MulticastSocket receiveMulticast = new MulticastSocket(port);

                   receiveMulticast.joinGroup(receiveAddress);

                   DatagramPacket dp = new DatagramPacket(new byte[RECEIVE_LENGTH], RECEIVE_LENGTH);

                   receiveMulticast.receive(dp);

                   System.out.println(new String(dp.getData()).trim());

                   receiveMulticast.close();

         }

}
接下来实现多播发送方的代码:

package cn.edu.heut.zcl.multicast;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class UDPMulticastClient {
                   static String destAddressStr = "224.0.0.1";
                   static int destPortInt = 9998;
                   static int TTLTime = 4;
         public static void main(String[] args) throws Exception {                 
                   InetAddress destAddress = InetAddress.getByName(destAddressStr);
                   if(!destAddress.isMulticastAddress()){//检测该地址是否是多播地址
                            throw new Exception("地址不是多播地址");
                   }
                   int destPort = destPortInt;
                   int TTL = TTLTime;
                   MulticastSocket multiSocket =new MulticastSocket();
                   multiSocket.setTimeToLive(TTL);
                   byte[] sendMSG = "11#msg".getBytes();
                   DatagramPacket dp = new DatagramPacket(sendMSG, sendMSG.length, destAddress  , destPort);
                   multiSocket.send(dp);
                   multiSocket.close();
         }
}
在多播中设置了TTl值(Time to live),每一个ip数据报文中都包含一个TTL,每当有路由器转发该报文时,TTL1,知道减为0时,生命周期结束,报文即时没有到达目的地,也立即宣布死亡。当然在Java中,ttl并不是十分准确的,曾经在一本书中介绍过报文的传播距离是不会超过ttl所设置的值的。

转自:http://158067568.iteye.com/blog/901052

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在C#中,你可以使用UDP协议进行单播、多播广播通信。下面是一些基本概念和代码示例: 1. 单播(Unicast):将数据从一个发送方发送到一个接收方。 ```csharp // 发送方 using (UdpClient udpClient = new UdpClient()) { string message = "Hello, Unicast!"; byte[] bytes = Encoding.ASCII.GetBytes(message); udpClient.Send(bytes, bytes.Length, "接收方IP地址", 接收方端口号); } // 接收方 using (UdpClient udpClient = new UdpClient(接收方端口号)) { IPEndPoint senderEndpoint = new IPEndPoint(IPAddress.Any, 0); byte[] bytes = udpClient.Receive(ref senderEndpoint); string message = Encoding.ASCII.GetString(bytes); Console.WriteLine("接收到消息: " + message); } ``` 2. 多播(Multicast):将数据从一个发送方发送到一组接收方。 ```csharp // 发送方 using (UdpClient udpClient = new UdpClient()) { udpClient.JoinMulticastGroup(组播组IP地址); string message = "Hello, Multicast!"; byte[] bytes = Encoding.ASCII.GetBytes(message); udpClient.Send(bytes, bytes.Length, 组播组IP地址, 接收方端口号); } // 接收方 using (UdpClient udpClient = new UdpClient(接收方端口号)) { udpClient.JoinMulticastGroup(组播组IP地址); IPEndPoint senderEndpoint = new IPEndPoint(IPAddress.Any, 0); byte[] bytes = udpClient.Receive(ref senderEndpoint); string message = Encoding.ASCII.GetString(bytes); Console.WriteLine("接收到消息: " + message); } ``` 3. 广播(Broadcast):将数据从一个发送方发送到同一子网中的所有接收方。 ```csharp // 发送方 using (UdpClient udpClient = new UdpClient()) { udpClient.EnableBroadcast = true; string message = "Hello, Broadcast!"; byte[] bytes = Encoding.ASCII.GetBytes(message); udpClient.Send(bytes, bytes.Length, "255.255.255.255", 接收方端口号); } // 接收方 using (UdpClient udpClient = new UdpClient(接收方端口号)) { IPEndPoint senderEndpoint = new IPEndPoint(IPAddress.Any, 0); byte[] bytes = udpClient.Receive(ref senderEndpoint); string message = Encoding.ASCII.GetString(bytes); Console.WriteLine("接收到消息: " + message); } ``` 请注意,示例中的IP地址和端口号需要根据实际情况进行替换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值