【Win 10 应用开发】UDP广播
我们知道,对于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广播的更多相关文章
- 【Win 10 应用开发】启动远程设备上的应用
这个功能必须在“红石-1”(build 14393)以上的系统版中才能使用,运行在一台设备上的应用,可以通过URI来启动另一台设备上的应用.激活远程应用需要以下前提: 系统必须是build 14393 ...
- 【Win 10 应用开发】导入.pfx证书
这个功能其实并不常用,一般开发较少涉及到证书,不过,简单了解一下还是有必要的. 先来说说制作测试证书的方法,这里老周讲两种方法,可以生成用于测试的.pfx文件. 产生证书,大家都知道有个makecer ...
- 【Win 10应用开发】Adaptive磁贴模板的XML文档结构
在若干天之前,老周给大家讲了Adaptive Toast通知的XML模板,所以相应地,今天老周给大家介绍一下Adaptive磁贴的新XML模板. 同样道理,你依旧可以使用8.1时候的磁贴模板,在win ...
- 【Win 10 应用开发】RTM版的UAP项目解剖
Windows 10 发布后,其实SDK也偷偷地在VS的自定义安装列表中出现了,今天开发人员中心也更新了下载.正式版的SDK在API结构上和以前预览的时候是一样的,只是版本变成10240罢了,所以大家 ...
- 【Win 10应用开发】认识一下UAP项目
Windows 10 SDK预览版需要10030以上版本号的Win 10预览版系统才能使用.之前我安装的9926的系统,然后安装VS 2015 CTP 6,再装Win 10 SDK,但是在新建项目后, ...
- 【Win 10 应用开发】在代码中加载文本资源
记得前一次,老周给大伙,不,小伙伴们介绍了如何填写 .resw 文件,并且在 XAML 中使用 x:Uid 标记来加载.也顺便给大伙儿分析了运行时是如何解析 .resw 文件的. 本来说好了,后续老周 ...
- 【Win 10应用开发】延迟共享
延迟共享是啥呢,这么说吧,就是在应用程序打开共享面板选择共享目标时,不会设置要共享的数据,而是等到共享目标请求数据时,才会发送数据,而且,延迟操作可以在后台进行. 这样说似乎过于抽象,最好的诠释方法, ...
- 【Win 10 应用开发】Toast通知激活应用——前台&后台
老周最近热衷于讲故事,接下来还是讲故事时间. 有人问我:你上大学的时候,有加入过学生会吗?读大学有没有必要加入学生会? 哎哟,这怎么回答呢,从短期来说,加入学生会有点用,至少可以娱乐一下,运气好的话, ...
- 【Win 10 应用开发】InkToolBar——涂鸦如此简单
从WPF开始,就有个InkCanvas控件,封装了数字墨迹处理相关的功能,Silverlight到Win 8 App,再到UWP应用,都有这个控件,所以,老周说了3688遍,凡是.net基础扎实者,必 ...
随机推荐
- 如何一步一步用DDD设计一个电商网站(五)—— 停下脚步,重新出发
阅读目录 前言 单元测试 纠正错误,重新出发 结语 一.前言 实际编码已经写了2篇了,在这过程中非常感谢有听到观点不同的声音,借着这个契机,今天这篇就把大家提出的建议一个个的过一遍,重新整理,重新出发 ...
- Linux下服务器端开发流程及相关工具介绍(C++)
去年刚毕业来公司后,做为新人,发现很多东西都没有文档,各种工具和地址都是口口相传的,而且很多时候都是不知道有哪些工具可以使用,所以当时就想把自己接触到的这些东西记录下来,为后来者提供参考,相当于一个路 ...
- 使用python抓取婚恋网用户数据并用决策树生成自己择偶观
最近在看<机器学习实战>的时候萌生了一个想法,自己去网上爬一些数据按照书上的方法处理一下,不仅可以加深自己对书本的理解,顺便还可以在github拉拉人气.刚好在看决策树这一章,书里面的理论 ...
- SQL Server-聚焦NOT IN VS NOT EXISTS VS LEFT JOIN...IS NULL性能分析(十八)
前言 本节我们来综合比较NOT IN VS NOT EXISTS VS LEFT JOIN...IS NULL的性能,简短的内容,深入的理解,Always to review the basics. ...
- 跟着老男孩教育学Python开发【第三篇】:Python函数
set 无序,不重复,可嵌套. 函数 创建函数: 1.def关键字,创建函数 2.函数名 3.() 4.函数体 5.返回值 发邮件函数 def sendmail(): import smtpl ...
- 怎样在Dos里切换盘符
一:在Dos里切换盘符 a:在电脑左下角右击显示图片;(我用的是win10系统,其他系统类似) b:点击运行,输入cmd; c:点击确定: d:输入盘符:(如f:) 或F: 只写字母,不写分号是不行的 ...
- [原创]Macbook Pro Retina 15吋安装Windows 7和Windows 8.1方法
前言 本以为有Bootcamp神器在手,Macbook装Win系统应该是不在话下,没想到着实折腾了一番.期间因为误操作导致OSX也挂掉进不去只得磁盘全部抹掉网络恢复安装.为了让大家少走弯路,提供个人安 ...
- MEF学习
一. 什么是MEF MEF(Managed Extensibility Framework)是一个用于创建可扩展的轻型应用程序的库. 应用程序开发人员可利用该库发现并使用扩展,而无需进行配置. 扩 ...
- Linux学习日记(二)
在linux上运行.Net程序 并安装Linux网站 一.环境 ubuntu14.10(桌面版 官网下载的最新版) jexus5.6.3 正式版 MonoDevloper (安装完后里面有个Ubunt ...
- 快速web开发中的前后端框架选型最佳实践
这个最佳实践是我目前人在做的一个站点,主要功能: oauth登录 发布文章(我称为"片段"),片段可以自定义一些和内容有关的指标,如“文中人物:12”.支持自定义排版.插图.建立相 ...