我们知道,对于UDP协议的通信,除了可以用来聊天外,可以发送广播数据。只要向广播地址的某个端口发送数据就可以进行广播,子网中只要监听该端口的socket就能收到广播消息。

最简单的方法就是向255.255.255.255发送消息,这样就可以在本地网络中广播了,由于路由器不转发对该地址所发送的内容,所以只能用于本地网络。但这已经够用了,至少连接到同一个路由器的设备都能收到消息。

下面,咱们就来演示一下,如何进行广播。

先看接收端的实现。

RT库API提供了一个名为DatagramSocket的类,就是用来实现UDP通信的。对于数据接收者,处理过程如下:

1、new一个实例。

2、处理MessageReceived事件,只要有新的消息收到,就会引发该事件。

3、调用BindServiceNameAsync方法绑定一个本地端口,只要发送到该端口的数据都会被接收;或者调用BindEndpointAsync方法绑定本地结点,此方法需要明确指定一个本机地址。

4、在MessageReceived事件的处理中,通过事件参数可以得到一些基本信息。比如,LocalAddress本机地址,RemotePort远程端口,RemoteAddress远程主机地址。

具体如下面代码。

        private async void OnMsgReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args)
{
string remoteaddr = args.RemoteAddress.DisplayName;
DataReader reader = args.GetDataReader();
reader.UnicodeEncoding = UnicodeEncoding.Utf8;
// 读长度
uint len = reader.ReadUInt32();
// 读内容
string msg = reader.ReadString(reader.UnconsumedBufferLength); ……
}

调用事件参数的GetDataStream方法可以得到输入流,用来读取接收到的数据。更好用的是通过GetDataReader方法,直接能得到一个DataReader实例,这样你就可以直接读取需要的内容了。

不过呢,通过GetDataReader方法得到的DataReader对象不知道是不是经过特殊处理了,在读取前不需要调用LoadAsync方法来加载数据了,GetDataReader方法返回的DataReader的UnconsumedBufferLength属性默认就是大于0,即数据已自动加载到Reader中了,我们直接就可以读了。

随后,再看看如何实现广播消息的发送端。

这个就更TNND简单了,直接把消息发给255.255.255.255就行了,可以从IpAddress类的Broardcast字段得到。

            using (DatagramSocket socket = new DatagramSocket())
{
// 广播地址 255.255.255.255
HostName broardaddr = new HostName(IPAddress.Broadcast.ToString());
IOutputStream outstream = await socket.GetOutputStreamAsync(broardaddr, "");
DataWriter writer = new DataWriter(outstream);
// 设置编码格式
writer.UnicodeEncoding = UnicodeEncoding.Utf8;
// 处理字符串长度
uint len = writer.MeasureString(content);
// 写入长度
writer.WriteUInt32(len);
// 写入内容
writer.WriteString(content);
// 提交
await writer.StoreAsync();
// 释放
writer.Dispose();
}

实例化socket后,调用GetOutputStreamAsync方法,并指定目标地址和端口,就可以直接得到一个IOutputStream,表示输出流,向这个流写入数据就可以发送了。

可以通过DataWriter类来简单完成,由于这里发的是字符串,长度不确定,故要先发送长度,再发内容,以便接收方可以确定内容长度。

测试的时候,最好多弄几台设备来试,我就用笔记本、山寨板、手机三台设备来测试。哦,对了,在手机上运行很简单,用USB连上,直接运行就可以了。平板上测试与远程调试一样,先在板子上安装VS远程调试工具,因为平板就是一台电脑,所以操作和远程调试一样。

以下是测试结果:

示例代码下载

【Win 10 应用开发】UDP广播的更多相关文章

  1. 【Win 10 应用开发】启动远程设备上的应用

    这个功能必须在“红石-1”(build 14393)以上的系统版中才能使用,运行在一台设备上的应用,可以通过URI来启动另一台设备上的应用.激活远程应用需要以下前提: 系统必须是build 14393 ...

  2. 【Win 10 应用开发】导入.pfx证书

    这个功能其实并不常用,一般开发较少涉及到证书,不过,简单了解一下还是有必要的. 先来说说制作测试证书的方法,这里老周讲两种方法,可以生成用于测试的.pfx文件. 产生证书,大家都知道有个makecer ...

  3. 【Win 10应用开发】Adaptive磁贴模板的XML文档结构

    在若干天之前,老周给大家讲了Adaptive Toast通知的XML模板,所以相应地,今天老周给大家介绍一下Adaptive磁贴的新XML模板. 同样道理,你依旧可以使用8.1时候的磁贴模板,在win ...

  4. 【Win 10 应用开发】RTM版的UAP项目解剖

    Windows 10 发布后,其实SDK也偷偷地在VS的自定义安装列表中出现了,今天开发人员中心也更新了下载.正式版的SDK在API结构上和以前预览的时候是一样的,只是版本变成10240罢了,所以大家 ...

  5. 【Win 10应用开发】认识一下UAP项目

    Windows 10 SDK预览版需要10030以上版本号的Win 10预览版系统才能使用.之前我安装的9926的系统,然后安装VS 2015 CTP 6,再装Win 10 SDK,但是在新建项目后, ...

  6. 【Win 10 应用开发】在代码中加载文本资源

    记得前一次,老周给大伙,不,小伙伴们介绍了如何填写 .resw 文件,并且在 XAML 中使用 x:Uid 标记来加载.也顺便给大伙儿分析了运行时是如何解析 .resw 文件的. 本来说好了,后续老周 ...

  7. 【Win 10应用开发】延迟共享

    延迟共享是啥呢,这么说吧,就是在应用程序打开共享面板选择共享目标时,不会设置要共享的数据,而是等到共享目标请求数据时,才会发送数据,而且,延迟操作可以在后台进行. 这样说似乎过于抽象,最好的诠释方法, ...

  8. 【Win 10 应用开发】Toast通知激活应用——前台&后台

    老周最近热衷于讲故事,接下来还是讲故事时间. 有人问我:你上大学的时候,有加入过学生会吗?读大学有没有必要加入学生会? 哎哟,这怎么回答呢,从短期来说,加入学生会有点用,至少可以娱乐一下,运气好的话, ...

  9. 【Win 10 应用开发】InkToolBar——涂鸦如此简单

    从WPF开始,就有个InkCanvas控件,封装了数字墨迹处理相关的功能,Silverlight到Win 8 App,再到UWP应用,都有这个控件,所以,老周说了3688遍,凡是.net基础扎实者,必 ...

随机推荐

  1. Mapreduce的文件和hbase共同输入

    Mapreduce的文件和hbase共同输入 package duogemap;   import java.io.IOException;   import org.apache.hadoop.co ...

  2. ASP.NET Aries 入门开发教程9:业务表单的开发

    前言: 经过前面那么多篇的列表的介绍,终于到了大伙期待的表单开发了. 也是本系列的最后一篇文章了! 1:表单页面的权限设置与继承 对于表单页面,权限的设置有两种: 1:你可以选择添加菜单(设置为不显示 ...

  3. 利用Node.js的Net模块实现一个命令行多人聊天室

    1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...

  4. log4net使用手册

    1. log4net简介 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.Java平台下,它还 ...

  5. UML图中经常用到几种的关系图例

    学习这个东西挺奇怪的,时间一长就容易忘记,或者记不清楚.今天看到一些UML图的关系,发现有些出入了,索性就写下来,以后再忘记的时候过来看看. 在UML的类图中,常见的有以下几种关系: 继承(Gener ...

  6. Jqprint实现页面打印

    好些项目需要实现页面打印,特别是一些后台管理类系统,下面介绍一款轻量级的打印插件: 1.实现页面打印要引入jQuery和Jqprint.点击下载Jqprint插件 <script languag ...

  7. 电脑新建svn仓库

    步骤1:安转svg: 注意事项: 安装的时候选择:Modify 安装到以下图片的步骤时: 黄色区域选择: 步骤2:新建svn仓库文件夹(本教程例子:D:\svn-5gpos),选择文件夹右键,点击下图 ...

  8. 笔记:Memory Notification: Library Cache Object loaded into SGA

    笔记:Memory Notification: Library Cache Object loaded into SGA在警告日志中发现一些这样的警告信息:Mon Nov 21 14:24:22 20 ...

  9. 在配有英特尔® Iris™ 显卡的系统上通过优化对 Just Cause 3 进行增强

    高端 PC 继续通过高性能显卡驱动桌面游戏. 一流的"梦想机器"基于第六代智能 英特尔® 酷睿™ 处理器i7-6700K等 CPU,通常与高端独立显卡配合使用以运行要求最严苛的游戏 ...

  10. BRDF 光照模型

    http://blog.csdn.net/liu_lin_xm/article/details/4846144