`
158067568
  • 浏览: 327001 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

UDP广播与多播简单实现

阅读更多

UDP广播与多播

作者:legend

QQ158067568

使用UDP协议进行信息的传输之前不需要建议连接。换句话说就是客户端向服务器发送信息,客户端只需要给出服务器的ip地址和端口号,然后将信息封装到一个待发送的报文中并且发送出去。至于服务器端是否存在,或者能否收到该报文,客户端根本不用管。

通常我们讨论的udp的程序都是一对一的单播程序。本章将讨论一对多的服务:广播(broadcast)、多播(multicast)。对于广播,网络中的所有主机都会接收一份数据副本。对于多播,消息只是发送到一个多播地址,网络知识将数据分发给哪些表示想要接收发送到该多播地址的数据的主机。总得来说,只有UDP套接字允许广播或多播。

UDP广播

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

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

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

UDP多播

同样的UDP多播也要指明接受者的端口号,而且与广播相似的是多播与单播之间的区别还在于地址。ipv4中的多播地址范围是:224.0.0.0239.255.255.255。在JAVA中,多播一样十分好实现,要实现多播,就要用到MulticastSocket类,其实该类就是DatagramSocket的子类,在使用时除了多播自己的一些特性外,把它当做DatagramSocket类使用就可以了。下面将给出一个简单的多播接受数据的例子:

package cn.edu.heut.zcl.multicast;

 

import java.net.DatagramPacket;

import java.net.InetAddress;

import java.net.MulticastSocket;

 

public class UDPMulticastServer {

         final static int RECEIVE_LENGTH = 1024;

         static String multicastHost="224.0.0.1";

         static int localPort = 9998;

         public static void main(String[] args) throws Exception {

                   

                   InetAddress receiveAddress =InetAddress.getByName(multicastHost);

                   if(!receiveAddress.isMulticastAddress()){//测试是否为多播地址

                            throw new Exception("请使用多播地址");

                   }

                   int port = localPort;

                   MulticastSocket receiveMulticast = new MulticastSocket(port);

                   receiveMulticast.joinGroup(receiveAddress);

                   DatagramPacket dp = new DatagramPacket(new byte[RECEIVE_LENGTH], RECEIVE_LENGTH);

                   receiveMulticast.receive(dp);

                   System.out.println(new String(dp.getData()).trim());

                   receiveMulticast.close();

         }

}

 

 

 

 

 

接下来实现多播发送方的代码:

package cn.edu.heut.zcl.multicast;

 

import java.net.DatagramPacket;

import java.net.InetAddress;

import java.net.MulticastSocket;

 

public class UDPMulticastClient {

 

                   static String destAddressStr = "224.0.0.1";

                   static int destPortInt = 9998;

                   static int TTLTime = 4;

         public static void main(String[] args) throws Exception {

                   

                   InetAddress destAddress = InetAddress.getByName(destAddressStr);

                   if(!destAddress.isMulticastAddress()){//检测该地址是否是多播地址

                            throw new Exception("地址不是多播地址");

                   }

                   int destPort = destPortInt;

                   int TTL = TTLTime;

                   MulticastSocket multiSocket =new MulticastSocket();

                   multiSocket.setTimeToLive(TTL);

                   byte[] sendMSG = "11#msg".getBytes();

                   DatagramPacket dp = new DatagramPacket(sendMSG, sendMSG.length, destAddress  , destPort);

                   multiSocket.send(dp);

                   multiSocket.close();

         }

}

 

 

在多播中设置了TTl值(Time to live),每一个ip数据报文中都包含一个TTL,每当有路由器转发该报文时,TTL1,知道减为0时,生命周期结束,报文即时没有到达目的地,也立即宣布死亡。当然在Java中,ttl并不是十分准确的,曾经在一本书中介绍过报文的传播距离是不会超过ttl所设置的值的。

 

 

 

 

 

 

  • src.rar (2.5 KB)
  • 下载次数: 349
5
0
分享到:
评论
2 楼 flyar 2014-08-15  
你好!我按照你的代码实现多点广播,但是在一台机子休眠,另一台手机不休眠,重启wifi后,等待两台手机都连接到wifi,打开休眠那一台手机,两台手机都接受不到广播了,是怎么回事。重新进入app也接受不到
1 楼 joefei 2013-11-04  
看過好多篇關於UDP的廣播和組播介紹的,還是樓主這篇最好,簡潔明瞭,讓我茅塞頓開。

相关推荐

    Udp单播、组播(多播)和广播实现源码(Qt实现).rar

    整理的用Qt实现的三种Udp方式:单播、组播(多播)和广播源代码,可以很好的看出三种方式的发送接收的区别,简单直接一看就懂得干货。

    工业领域使用qt开发UDP通信功能的实现(包括单播,广播,组播)

    本软件实现了两台甚至多台电脑之间使用UDP通信的功能,包括单播,广播,组播的功能实现,三种发送方式的切换在代码中已标明。 默认状态为本机发送,本机接受,也就是接收端的ip地址设置为127.0.0.1,用户可根据实际...

    UDP通讯 WPF 广播 单播

    WPF+C#广播和单播示例 实现功能:添加聊天组 显示聊天组成员 多人聊天和单聊 界面简单,目的在于联系UDP通讯,对于图片的处理还未完成,Demo中的保存数据按钮目前没添加功能,欢迎大家一块研究

    QT udp实例

    Qt环境下使用udp socket实现网络通信的一个精简的例子

    iOS UDP广播封装

    对GCDAsyncUdpSocket进行封装,可对服务器端口进行监听,简单调用即可实现。UDP广播监听。

    nodejs实现UDP组播示例方法

    下面的示例主要实现简单的UDP组播方式。可以正常收发UDP数据。 Server端代码 const dgram = require('dgram'); const server = dgram.createSocket('udp4'); // const local_ip = 192.168.0.xx; const multicast_...

    Linux下UDP通信

    在linux下的udp通信,采用c语言编写,可实现简单的文件下载与上传,适用于初学者

    Node.js dgram模块实现UDP通信示例代码

    2、了解UDP单播、广播和组播 单播:向一个单播地址发送UDP数据报时,数据报只能被指定的IP主机接收,同一子网下的其它主机都不会接收该数据报。单播过程(假设子网地址:192.168.10,该子网下有两台主机:192.168....

    简单网络时间协议( SNTP)

    它能用单播方式(点对点)和广播方式(点对多点)操作。它也能在IP 多播方式下 操作(可提供这种服务的地方)。SNTP与当前及以前的NTP版本并没有大的不同。但它是更简单, 是一个无状态的远程过程调用(RPC),其准确和...

    C#网络应用高级编程

    3.3 利用UDP进行广播和组播  3.3.1 通过Internet实现群发功能  3.3.2 在Internet上举行网络会议讨论  习题  第4章 P2P应用编程  4.1 P2P基础知识  4.2 P2P应用举例  习题  第5章 SMTP与POP3...

    TCPIP详解卷[1].part06

    第12章 广播和多播 128 12.1 引言 128 12.2 广播 129 12.2.1 受限的广播 129 12.2.2 指向网络的广播 129 12.2.3 指向子网的广播 129 12.2.4 指向所有子网的广播 130 12.3 广播的例子 130 12.4 多播 132 12.4.1 多播...

    TCP-IP详解-卷2实现分两部分-part2

    12.15 多播输出处理:ip_output函数 298 12.16 性能的考虑 301 12.17 小结 301 第13章 IGMP:Internet组管理协议 303 13.1 引言 303 13.2 代码介绍 304 13.2.1 全局变量 304 13.2.2 统计量 304 13.2.3 SNMP变量 305 ...

    cilent-sever.rar

    1. 分别编写基于TCP或UDP的socket程序服务端和客户端,实现客户端和服务端间的简单信息交换功能,即服务端和客户端能依次从键盘输入文字信息并发送。 2. 服务端实现消息转发功能,设计通信协议,使得任意一个客户端...

    MIConfigApp.rar

    现在有个需求是,App与智能硬件进行UDP通讯,进行数据交互。 着手展开编写android代码,百度UDP通讯。其实还是比较简单的,并不是很困难...我基于这个又重新封装一下,可以当做工具来用,实现UDP广播单播与接收消息。

    TCPIP协议详解卷2:实现

    本书不仅说明了插口API和协议族的关系以及主机实现与路由器实现的差别。还介绍了4.4BSD-Lite版的新的特点,如多播、长肥管道支持、窗口缩放、时间戳选项以及其他主题等等。读者阅读本书时,应当具备卷1中阐述的关于...

    TCP-IP详解卷2:实现.part1

    本书不仅说明了插口API和协议族的关系以及主机实现与路由器实现的差别。还介绍了4.4BSD-Lite版的新的特点,如多播、长肥管道支持、窗口缩放、时间戳选项以及其他主题等等。读者阅读本书时,应当具备卷1中阐述的关于...

    TCP-IP详解卷2:实现.part2

    本书不仅说明了插口API和协议族的关系以及主机实现与路由器实现的差别。还介绍了4.4BSD-Lite版的新的特点,如多播、长肥管道支持、窗口缩放、时间戳选项以及其他主题等等。读者阅读本书时,应当具备卷1中阐述的关于...

    tcp-ip详解2:协议的实现

    12.15 多播输出处理:ip_output函数 298 12.16 性能的考虑 301 12.17 小结 301 第13章 IGMP:Internet组管理协议 303 13.1 引言 303 13.2 代码介绍 304 13.2.1 全局变量 304 13.2.2 统计量 304 13.2.3 SNMP变量 305 ...

Global site tag (gtag.js) - Google Analytics