文档章节

Android UDP的两种广播方式

IamOkay
 IamOkay
发布于 2016/11/28 09:59
字数 1565
阅读 283
收藏 0

广播地址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地址是目标主机地址。

© 著作权归作者所有

共有 人打赏支持
IamOkay
粉丝 187
博文 459
码字总数 372015
作品 0
海淀
程序员
Android引入广播机制的用意。单线程模型Message、Handler、Message Que.

注册广播有几种方式,这些方式有何优缺点?请谈谈Android引入广播机制的用意。 Android 的广播机制 在 Android 里面有各种各样的广播,比如电池的使用状态,电话的接收和短信的接收都会产生一...

一别经年
2014/03/15
0
0
android broadcastReceiver生命周期及两种应用

一:Android 广播的生命周期 一个广播接收者有一个回调方法:void onReceive(Context curContext, Intent broadcastMsg)。当一个广播消息到达接收者时,Android调用它的onReceive()方法并传递...

gavin_jin
2012/02/17
0
4
Android APP内跨进程广播遇到的问题

Android跨进程通信,其中有一种方式就是发送广播。 1. 首先注册接收广播,并设置多进程。 使用android:process设置多进程。 参数值有两种形式,进程名以":"开头属于当前应用的私有进程,其他...

_OUTMAN_
09/28
0
0
BroadcastReceiver—简介

Android BroadcastReceiver 简介 在 Android 中使用 Activity, Service, Broadcast, BroadcastReceiver 活动(Activity) - 用于表现功能 服务(Service) - 相当于后台运行的 Activity 广播(Br......

zt1212
2012/10/12
0
0
使用广播-BroadcastReceiver最详细解析

女孩:BroadcastReceiver是什么呀? 男孩:Broadcast是广播的意思,在Android中应用程序之间的传输信息的机制,BroadcastReceiver是接收广播通知的组件,广播和广播接收器是Android中需要了解...

达叔小生
07/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

6. Python3源码—List对象

6.1. List对象 List对象是“变长对象”。 6.1.1. Python中的创建 Python中List对象最重要的创建方法为PyList_New,如下Python语句最终会调用到PyList_New: test = [1, 2, 3, 4, 5] 6.1.2. ...

Mr_zebra
9分钟前
1
0
nginx屏蔽指定接口(URL)

Step1:需求 web平台上线后,需要屏蔽某个服务接口,但又不想重新上线,可以采用nginx屏蔽指定平台接口的办法 Step2:具体操作 location /dist/views/landing/UNIQUE_BEACON_URL { re...

Linux_Anna
16分钟前
2
0
tomcat高并发配置调优

作者:Joker-pan 原文:https://blog.csdn.net/u011622226/article/details/72510385?utm_source=copy --------------------- tomcat 解压就使用的,配置都没动过,肯定不能支持高并发了; ...

imbiao
35分钟前
2
0
mysql 联结,级联查询总结区分

其实我对 数据库的级联或者联结查询一直都是会用,项目能查询出来自己想要的结果即可。 毕竟SQL使用复杂的查询毕竟比较少,而且不难使用。 至于区分他们,我还真的有点模糊。 在看 《SQL必知...

之渊
52分钟前
2
0
区块链入门教程分享区块链POW证明代码实现demo

兄弟连区块链入门教程分享区块链POW证明代码实现demo 这里强调一下区块链的协议分层 应用层 合约层 激励机制 共识层 网络层 数据层 上 一篇主要实现了区块链的 数据层,数据层主...

兄弟连区块链入门教程
59分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部