Android UDP的两种广播方式

原创
2016/11/28 09:59
阅读数 2.1K

广播地址255.255.255.255和组播地址224.0.1.140

 

单播”(Unicast)、“多播”(Multicast)和“广播”(Broadcast)这三个术语都是用来描述网络节点之间通讯方式的术语。那么这些术语究竟是什么意思?区别何在?

1. 单播:网络节点之间的通信就好像是人们之间的对话一样。如果一个人对另外一个人说话,那么用网络技术的术语来描述就是“单播”,此时信息的接收和传递只在两个节点之间进行。单播在网络中得到了广泛的应用,网络上绝大部分的数据都是以单播的形式传输的,只是一般网络用户不知道而已。例如,你在收发电子邮件、浏览网页时,必须与邮件服务器、Web服务器建立连接,此时使用的就是单播数据传输方式。但是通常使用“点对点通信”(Point to Point)代替“单播”,因为“单播”一般与“多播”和“广播”相对应使用。

2.多播:“多播”也可以称为“组播”,在网络技术的应用并不是很多,网上视频会议、网上视频点播特别适合采用多播方式。因为如果采用单播方式,逐个节点传输,有多少个目标节点,就会有多少次传送过程,这种方式显然效率极低,是不可取的;如果采用不区分目标、全部发送的广播方式,虽然一次可以传送完数据,但是显然达不到区分特定数据接收对象的目的。采用多播方式,既可以实现一次传送所有目标节点的数据,也可以达到只对特定对象传送数据的目的。IP网络的多播一般通过多播IP地址来实现。多播IP地址就是D类IP地址,即224.0.0.0至239.255.255.255之间的IP地址。 Windows 2000中的DHCP管理器支持多播IP地址的自动分配。

3.广播:“广播”在网络中的应用较多,如客户机通过 DHCP自动获得IP地址的过程就是通过广播来实现的。但是同单播和多播相比,广播几乎占用了子网内网络的所有带宽。拿开会打一个比方吧,在会场上只能有一个人发言,想象一下如果所有的人同时都用麦克风发言,那会场上就会乱成一锅粥。集线器由于其工作原理决定了不可能过滤广播风暴,一般的交换机也没有这一功能,不过现在有的网络交换机(如全向的QS系列交换机)也有过滤广播风暴功能了,路由器本身就有隔离广播风暴的作用。广播风暴不能完全杜绝,但是只能在同一子网内传播,就好像喇叭的声音只能在同一会场内传播一样,因此在由几百台甚至上千台电脑构成的大中型局域网中,一般进行子网划分,就像将一个大厅用墙壁隔离成许多小厅一样,以达到隔离广播风暴的目的。在IP网络中,广播地址用IP地址“255.255.255.255”来表示,这个IP地址代表同一子网内所有的IP地址。

多播示例代码

package com.goma.test;  
  
import java.net.DatagramPacket;  
import java.net.InetAddress;  
import java.net.MulticastSocket;  
  
public class MultiCastSend {  
    public static void main(String[]args){  
        try {  
            /******************发送组播数据****************/  
            //指定组播IP  
            InetAddress ip = InetAddress.getByName("228.5.6.7");  
          
            MulticastSocket s = new MulticastSocket();  
            //加入该组   
            s.joinGroup(ip);  
              
            //在多播中设置了TTl值(Time to live),每一个ip数据报文中都包含一个TTL,  
            //每当有路由器转发该报文时,TTL减1,知道减为0时,生命周期结束,报文即时没有到达目的地,  
            //也立即宣布死亡。当然在Java中,ttl并不是十分准确的,  
            //曾经在一本书中介绍过报文的传播距离是不会超过ttl所设置的值的。  
            s.setTimeToLive(1);  
              
            String msg = "IP:123123123;PORT:1231";  
            DatagramPacket hi = new DatagramPacket(msg.getBytes(), msg.length(),ip, 6789);  
            s.send(hi);  
            /******************发送组播数据****************/  
            s.close();  
              
        } catch (Exception e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
    }  
  
}  
  
  
  
  
  
package com.goma.test;  
  
import java.net.DatagramPacket;  
import java.net.InetAddress;  
import java.net.MulticastSocket;  
  
public class MultiCastReceive {  
    public static void main(String[]args){  
        try {  
            //IP组  
            InetAddress ip = InetAddress.getByName("228.5.6.7");  
            //组播监听端口  
            MulticastSocket s = new MulticastSocket(6789);  
            //加入该组   
            s.joinGroup(ip);  
  
            byte[] arb = new byte[24];  
            while (true) {  
                DatagramPacket datagramPacket = new DatagramPacket(arb,arb.length);  
                s.receive(datagramPacket);  
                System.out.println(new String(datagramPacket.getData(), 0, datagramPacket.getLength()));  
                System.out.println(arb.length);  
                System.out.println(new String(arb));  
            }  
        } catch (Exception e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
    }  
}  

 注:若在互联网上运行需要支持多播的路由器的支持(不可能每个客户端都安装相应的路由器,因此多播可以说,只支持局域网。)

广播示例代码

package com.goma.test;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class BroadCastSend {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			InetAddress ip = InetAddress.getByName("255.255.255.255");
			DatagramSocket ds = new DatagramSocket();
			String str = "Goma God Like.";
			DatagramPacket dp = new DatagramPacket(str.getBytes(),str.getBytes().length, ip, 3001);
	        ds.send(dp);
	        ds.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}// 创建用来发送数据报包的套接字  
	}
}



package com.goma.test;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class BroadCastReceive {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try{
	        DatagramSocket ds = new DatagramSocket(3001);// 创建接收数据报套接字并将其绑定到本地主机上的指定端口  
	        byte[] buf = new byte[1024]; 
	        DatagramPacket dp = new DatagramPacket(buf, buf.length);
	        ds.receive(dp);  
//	        String strRecv = new String(dp.getData(), 0, dp.getLength()) + " from "   + dp.getAddress().getHostAddress() + ":" + dp.getPort(); 
	        System.out.println(new String(buf));  
		}catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}

}

单播示例代码

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();
    }
}
 
 
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.util.Arrays;
 
//服务端
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);
 
        }
 
    }
}

单播和广播代码基本相通,不同之处是ip地址,广播的ip地址是255.255.255.255,单播的ip地址是目标主机地址。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部