文档章节

Android UDP的两种广播方式

IamOkay
 IamOkay
发布于 2016/11/28 09:59
字数 1565
阅读 345
收藏 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
粉丝 194
博文 469
码字总数 382565
作品 0
海淀
程序员
私信 提问
Android 手机上能通过DatagramSocket收到PC端的UDP广播吗?

我在PC端写了个UDP广播,我另一台电脑能收到的,但是android怎么也收不到,android的代码如下, ds = new DatagramSocket(1234, InetAddress.getByName(“192.168.1.3”)); dp = new Datagr...

ding404
2011/04/18
6K
2
Android 监听安装和卸载

Android 应用程序的安装和卸载事件,是由系统进行监听并全局广播的,支持1.5(android 3)以上 因此,如果想要监听获取应用的安装和卸载事件,只需要自定义一个BroadcastReceiver,来对系统广...

长平狐
2013/01/06
117
0
Android Service 服务(二)—— BroadcastReceiver

一、 BroadcastReceiver简介 BroadcastReceiver,用于异步接收广播Intent,广播Intent是通过调用Context.sendBroadcast()发送、BroadcastReceiver()接收。 广播Intent的发送是通过调用Conte...

长平狐
2013/01/06
145
0
android中如何发送一个广播

1.首先要声明广播 2.其次要注册广播,有两种方式:xml注册和代码注册 xml注册: 代码注册: IntentFilter filter = new IntentFilter(); filter.addAction("com.scott.sayhi"); MyActivity.......

长平狐
2013/12/25
6.9K
0
Android学习之BroadcastReceiver总结

Android学习之BroadcastReceiver总结 代码下载:http://download.csdn.net/detail/nuptboyzhb/4482544 关于BroadcastReceiver的概述: ①广播接收器是一个专注于接收广播通知信息,并做出对应...

长平狐
2012/10/08
3.1K
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux下端口转发工具rinetd介绍

linux下简单好用的工具rinetd,实现端口映射/转发/重定向,针对TCP协议,不支持UDP。 官网地址 http://www.boutell.com/rinetd 里面介绍及使用齐全。 使用场景举例: 阿里云内网Redis连接问题...

ouhoo
9分钟前
0
0
Oracle学习日志-5(算数运算符,比较运算符和逻辑运算符)

因为有编程基础,所以对于这一章还是很好理解,只需要注意对NULL的运算。 操作的表格 算数运算符 查询商品名字和商品售价,并商品售价乘2 SELECT product_name,sale_price * 2 AS "sale_pri...

白话
22分钟前
0
0
搜索引擎(Lucene介绍、分词器详解)

Lucene介绍 Lucene简介 最受欢迎的java开源全文搜索引擎开发工具包。提供了完整的查询引擎和索引引擎,部分文本分词引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简...

这很耳东先生
27分钟前
0
0
quartz详细介绍

quartz常用api Scheduler 调度程序交互的主要API。 Job 希望由调度程序执行的组件实现的接口。 JobDetail 用于定义作业的实例。 JobDataMap 可以包含不限量的序列化数据,在job运行的时候可以...

大笨象会跳舞吧
27分钟前
0
0
kotlin使用jackson序列化enum

默认情况下,我们序列化与反序列化enum是它的name,事实上大部分情况下我们需要序列化的是我们自定义的value,那应该怎么做呢? 这种情况下我们就需要@JsonValue与@JsonCreator data class U...

weidedong
31分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部