文档章节

Android UDP的两种广播方式

IamOkay
 IamOkay
发布于 2016/11/28 09:59
字数 1565
阅读 180
收藏 0
点赞 0
评论 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
博文 458
码字总数 369998
作品 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
BroadcastReceiver—简介

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

zt1212
2012/10/12
0
0
BroadcastReceiver的源码分析

android提供了广播机制,通过BroadcastReceiver可以在不同的进程间传递消息。类似于观察者模式,A应用通过注册广播表示A对消息subject感兴趣,当B应用发出subject类型的消息的时候,A应用就能...

JasmineBen
05/18
0
0
《Android深入透析》之广播(Broadcast)

概述 在android中,Broadcast作为四大组件之一,被广泛的应用在android程序之间的数据传递。举一个大家都比较熟悉的例子来说明。在车上的时候大家都有收听广播的习惯,广播电台通过发送不同频...

朵朵和糖糖
2014/11/12
0
0
andriod-四大组件之广播Broadcast-短信的收发

我想几乎所有的安卓开发者,第一个接触到的四大组件之一就是activity,而我在之前的文章中也写过, 在activity里面getContext是大佬级别的存在(可以看前几章), 那么四大组件中的广播Broad...

九尾74
05/24
0
0
一些常见的Android面试基础题做下总结,看看你能做出多少道

Intent的几种有关Activity启动的方式有哪些,你了解每个含义吗? 这里Android123提示大家,Intent的一些标记有FLAGACTIVITYBROUGHTTOFRONT 将activity带动最前面FLAGACTIVITYCLEARTOP清除顶部...

gavin_jin
2012/02/27
0
1
Android push (一):SMS push

Android push (一):SMS push 移动终端为了节省电量和网络流量,不再采用轮训服务器的方式来收集数据,而是在服务器有数据需要发送到终端时通知终端。我们称这种机制叫推送(push)。终端接...

LiSteven
2013/06/04
0
1
android广播和短信广播详解----使用广播接收者窃听短信

当系统收到短信时,会发出一个action名称为android.provier.Telephony.SMS_RECEIVED的广播Intent,该Intent存放了接收到的短信内容,使用名称 “pdus”即可从Intent中获取短信内容。 pdus是一...

程序袁_绪龙
2014/09/28
0
0
Android4.0有时接收不到开机广播

经过分析测试发现,如果应用程序安装上始终没有被打开过,那么在Android启动时,该应用无法接收到开机启动广播android.permission.RECEIVEBOOTCOMPLETED。 Android 3.1的更新文档中已经做了说...

mstian06
2013/12/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

StringUtils类中isEmpty与isBlank的区别

org.apache.commons.lang.StringUtils类提供了String的常用操作,最为常用的判空有如下两种isEmpty(String str)和isBlank(String str)。 StringUtils.isEmpty(String str) 判断某字符串是否为...

说回答
9分钟前
0
0
react native使用redux快速上手

先看个简单demo //app.jsimport React, {Component} from 'react';import {StyleSheet, Button, View} from 'react-native';import TestView from './src/testView'export default......

燕归南
11分钟前
0
0
页面输出JSON格式数据

package com.sysware.utils;import java.io.IOException;import javax.servlet.ServletResponse;import org.apache.log4j.Logger;import com.sysware.SyswareConstant;pub......

AK灬
32分钟前
0
0
springCloud-2.搭建Eureka Client的使用

1.使用IDEA,Spring Initializr创建 2.填写项目资料 3.选择spring boot版本,插件选择Cloud Discovery→Eureka Discovery 4.选择保存地址 5.修改application.yml eureka: client: s...

贺小康
35分钟前
0
0
CenOS 6.5 RPM 安装 elasticsearch 6.3.1

下载 wget --no-check-certificate https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.1.rpm...

阿白
38分钟前
0
0
1.4 创建虚拟机&1.5 安装CentOS7&1.6 配置ip(上)&1.7 配置ip(下)

1.4 创建虚拟机 知识点 虚拟机网络链接模式 桥连 直接将虚拟网卡桥接到一个物理网卡上面。需要手工为虚拟系统配置IP地址、子网掩码,而且还要和宿主机器处于同一网段,这样虚拟系统才能和宿主...

小丑鱼00
44分钟前
0
0
TrustAsia(亚洲诚信)助力看雪2018安全开发者峰会

2018年7月21日,看雪2018安全开发者峰会在北京国家会议中心圆满落下帷幕。拥有18年悠久历史的老牌安全技术社区——看雪学院联手国内最大开发者社区CSDN,汇聚业内顶尖的安全开发者和技术专家...

亚洲诚信
45分钟前
0
0
Spring注解介绍

@Resource、@AutoWired、@Qualifier 都用来注入对象。其中@Resource可以以 name 或 type 方式注入,@AutoWired只能以 type 方式注入,@Qualifier 只能以 name 方式注入。 但它们有一些细微区...

lqlm
55分钟前
0
0
32位汇编在64位Ubuntu上的汇编和连接

本教程使用的操作系统是Ubuntu Linux 18.04 LTS版本,汇编器是GNU AS(简称as),连接器是GNU LD(简称ld)。 以下是一段用于检测CPU品牌的汇编小程序(cpuid2.s): .section .dataoutput...

ryanliue
今天
0
0
CentOS系统启动报错Failed to mount /sysroot解决方法

xfs_repair -v -L /dev/dm-0

Mr_Tea伯奕
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部