UDP广播与多播

UDP广播

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

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

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

服务段代码:

[java]  view plain copy
  1. import java.io.IOException;  
  2. import java.net.DatagramPacket;  
  3. import java.net.DatagramSocket;  
  4. import java.net.InetAddress;  
  5. import java.net.SocketException;  
  6. import java.net.UnknownHostException;  
  7. import java.text.SimpleDateFormat;  
  8. import java.util.Date;  
  9. import java.util.Timer;  
  10. public class UdpSend {  
  11.     public void sendData()throws SocketException,  
  12.     UnknownHostException{  
  13.         DatagramSocket ds = new DatagramSocket();// 创建用来发送数据报包的套接字  
  14.         String str = "1";  
  15.         DatagramPacket dp = new DatagramPacket(str.getBytes(),  
  16.                 str.getBytes().length,  
  17.                 InetAddress.getByName("255.255.255.255"), 3001);  
  18.         // 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号  
  19.         try {  
  20.             ds.send(dp);  
  21.         } catch (IOException e) {  
  22.             e.printStackTrace();  
  23.         }  
  24.         ds.close();  
  25.           
  26.     }  
  27.     public static void main(String[] args) {  
  28.         Timer timer = new Timer();  
  29.         timer.schedule(new MyTask(), 10001000);  
  30.     }  
  31.     static class MyTask extends java.util.TimerTask{   
  32.         @Override  
  33.         public void run() {   
  34.             UdpSend tt = new UdpSend();  
  35.             Date d = new Date();  
  36.             SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");  
  37.             String strdate = sdf.format(d);  
  38.             String[] classTime = {"17:18:00","17:19:00","17:20:00"};  
  39.             for(int i = 0;i<classTime.length;i++){  
  40.                  if(classTime[i].equals(strdate)){  
  41.                      try {  
  42.                         tt.sendData();  
  43.                     } catch (SocketException e) {  
  44.                         // TODO Auto-generated catch block  
  45.                         e.printStackTrace();  
  46.                     } catch (UnknownHostException e) {  
  47.                         // TODO Auto-generated catch block  
  48.                         e.printStackTrace();  
  49.                     }  
  50.                  }  
  51.             }     
  52.         }  
  53.     }  
  54. }  

 

客户单简单代码示例,没有做循环

 

[java]  view plain copy
  1. package udp;  
  2. import java.net.DatagramPacket;  
  3. import java.net.DatagramSocket;  
  4. public class UdpRecv {  
  5.     public static void main(String[] args) throws Exception {  
  6.         DatagramSocket ds = new DatagramSocket(3001);// 创建接收数据报套接字并将其绑定到本地主机上的指定端口  
  7.         byte[] buf = new byte[1024];  
  8.         DatagramPacket dp = new DatagramPacket(buf, 1024);  
  9.         ds.receive(dp);  
  10.         String strRecv = new String(dp.getData(), 0, dp.getLength()) + " from "  
  11.                 + dp.getAddress().getHostAddress() + ":" + dp.getPort();  
  12.         System.out.println(strRecv);  
  13.         ds.close();  
  14.     }  
  15. }  

UDP多播

同样的UDP多播也要指明接受者的端口号,而且与广播相似的是多播与单播之间的区别还在于地址。ipv4中的多播地址范围是:224.0.0.0239.255.255.255

1、IP多播地址和多播组

           IP多播通信必须依赖于IP多播地址。在IPv4中它是一个D类IP地址,范围从224.0.0.0到239.255.255.255,地址 224.0.0.0 被保留,不应使用。 并被划分为局部链接多播地址、预留多播地址和管理权限多播地址三类。其中,局部链接多播地址范围在224.0.0.0~224.0.0.255,这是为路由协议和其它用途保留的地址,路由器并不转发属于此范围的IP包;预留多播地址为224.0.1.0~238.255.255.255,可用于全球范围(如 Internet)或网络协议;管理权限多播地址为239.0.0.0~239.255.255.255,可供组织内部使用,类似于私有IP地址,不能用于Internet,可限制多播范围。

 

      使用同一个IP多播地址接收多播数据包的所有主机构成了一个主机组,也称为多播组。一个多播组的成员是随时变动的,一台主机可以随时加入或离开多播组,多播组成员的数目和所在的地理位置也不受限制,一台主机也可以属于几个多播组。此外,不属于某一个多播组的主机也可以向该多播组发送数据包。


      2、加入或退出多播组

           可以通过使用所需端口创建 MulticastSocket,然后调用 joinGroup(InetAddress groupAddr) 方法来加入多播组。

      套接字通过 leaveGroup(InetAddress addr) 方法放弃组中的成员资格。

 

      3、发送或接收数据包

           当套接字预定多播组/端口时,像所有其他成员一样(组和端口相同),它将接收其他成员发送的数据报。
           将消息发送到多播组时,该主机和端口的所有预定接收者都将接收到消息(在数据包的生存范围内)。套接字不必成为多播组的成员即可向其发送消息。


      4、多个 MulticastSocket 可以同时预定多播组和端口,并且都会接收到组数据包。

 

      5、不允许 applet 使用多播套接字。

[java]  view plain copy
  1. // join a Multicast group and send the group salutations  
  2. String msg = "Hello";  
  3. InetAddress group = InetAddress.getByName("228.5.6.7");  
  4. MulticastSocket s = new MulticastSocket(6789);  
  5. s.joinGroup(group);  
  6. DatagramPacket hi = new DatagramPacket(msg.getBytes(), msg.length(), group, 6789);  
  7. s.send(hi);  
  8. // get their responses!  
  9. byte[] buf = new byte[1000];  
  10. DatagramPacket recv = new DatagramPacket(buf, buf.length);  
  11. s.receive(recv);  
  12. ...  
  13. // OK, I'm done talking - leave the group...  
  14. s.leaveGroup(group);  












  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值