文章转载自http://blog.csdn.net/keyboardota/article/details/11125073

  1. Bonjour简介
    Bonjour是Apple推出的零配置网络协议,主要的目的是在缺少中心服务器的情况下解决网络设备的IP获取,名称解析和服务发现等关键问题。
    Bonjour这个词来源于法语,是“你好”的意思,应该是指遵从这个协议的设备可以通过主动打招呼的形式发现彼此。Bonjour的法语发音大概为“甭油喝”,我们不会读法语,也不会延用法语发音,Bonjour的英语发音大概是“帮就而”,重音在第一个音节。

  2. Bonjour可以做什么
    如上面提到的,Bonjour可以完成的工作主要是在缺少中心服务器的情况下解决IP获取,名称解析和服务发现这三个问题。

IP获取
在传统网络环境下,设备的IP地址通过两种方式获取,一种是静态配置,通过手工方式为设备指定一个IP地址,一种是动态配置,设备通过路由器的DHCP服务获得动态的IP地址。在无中心服务器的网络环境下,没有中心服务器提供DHCP服务,用户手工配置IP地址也很不方便,这就需要一种新的方式来帮助设备获取IP地址,就是希望设备可以主动为自己指定一个可用的IP地址。
在IPV6环境下,IPV6协议本身就提供了设备自指定IP地址的能力,所以实现很简单,直接使用IPV6的协议支持就可以了。在IPV4环境下,Bonjour使用了随机指定IP地址的方法,首先为设备随机指定一个属于本地网段的IP地址,然后检查该地址在本地是否有冲突,如果有冲突就随机生成另一个新的IP地址,直到找到可用IP地址为止。
我在做测试的时候没有测试这部分,都是使用的DHCP的动态地址。以后有时间测试了这个部分后再和大家分享测试结果。

2.2 名称解析
在传统网络环境下,名称和IP地址的对应关系是通过DNS服务解析的。当一个设备需要访问一个域名,如“www.abc.com”,设备将“www.abc.com”发给DNS服务器,服务器返回该域名对应的IP地址,设备再使用返回的IP地址对目标服务器进行访问。
在没有中心服务器的网络环境中,没有DNS服务器提供域名解析服务,名称解析变成一个严重问题。针对这一问题,业界的解决方案是mDNS,中文叫“组播DNS”,在标准文档RFC6762中定义。
“组播DNS”的原理很简单,当一个设备需要解析一个名称时,如“abc.local.”,这个设备通过UDP协议向本地网络中的所有设备广播一个消息,问谁是“abc.local”,本地网络中如果有一个设备认为自己是“abc.local”,它就给出响应,说出自己的IP地址。因为“组播DNS”基于UDP协议,采用广播消息的方式,所以不需要一个中心服务器提供DNS解析服务就可以完成本地的名称解析。
Bonjour也是基于mDNS协议的,不过Bonjour在mDNS协议上作了扩展,加强了设备响应“组播DNS”请求的能力。在Bonjour协议下,应用只需要对某个名称进行注册,就可以将响应“组播DNS”请求的工作交由底层处理。也就是说在Bonjour协议下,应用不需要侦听本地网络的“组播DNS”请求并进行响应,这些工作由底层系统完成。为了区分全球域名和本地域名,mDNS协议使用“.local.”作为本地域名的根域名。

2.3 服务发现
当一个提供服务的设备获取IP地址,并自我指定一个域名后,其实还是不能满足用户的需求。因为用户需要的是某种服务,如打印服务,web服务,用户并不关心这些服务对应的服务器名称和它的IP地址。
为了让用户更容易发现本地网络中的各种服务,Bonjour为设备提供了服务发现的能力。
Bonjour提供的“服务发现”能力基于一个简单直接的规定,就是提供服务的设备在按以下标准对服务进行注册:“名称.服务类型.传输协议类型.local.”,比如如:“DamonWebServer._http._tcp.local.”,又比如“DummiesWebServer._http._tcp.local.”。
这样,当一个设备使用希望查找http服务的时候,Bonjour会去查找本地网络中注册过的包含”_http”的服务,然后将结果返回给用户选择。这时用户面对的是“DamonWebServer”和”DummiesWebServer”,用户可以不去关心到底这两个web服务到底在那台设备上,该设备的IP地址是什么。

如何使用Bonjour
对于最终用户来讲,Bonjour基本上是透明的,他们不需要了解如何去使用Bonjour,往往都是应用开发者去考虑如何使用Bonjour。
对于应用开发者来讲,他们需要考虑有两部分,一是如何作为Bonjour客户端去发现使用本地服务,二是如何作为服务端如何注册Bonjour服务

3.1 如何作为Bonjour客户端去发现本地服务
iOS开发可以使用NSNetService框架中的NSNetServiceBrowser类去发现本地服务。基本过程如下:首先创建NSNetServiceBrowser实例:

 serviceBrowser = [[NSNetServiceBrowser alloc] init];

然后指定NSNetServiceBrowser实例的代理,所指定的代理需要实现“NSNetServiceBrowserDelegate”协议。由实现以上协议的代理对服务查找相关的事件进行响应。这里指定本实例为NSNetServiceBrowser代理,由本例对服务查找的事件进行响应:

    serviceBrowser.delegate = self;

接着使用NSNetServiceBrowser实例的searchForServicesOfType方法查找服务,方法中可以指定需要查找的服务类型和查找的域。以下样例查找“local.”域中的“http”服务:

    [serviceBrowser searchForServicesOfType:@"_http._tcp." inDomain:@"local."];

最后,在“NSNetServiceBrowserDelegate”的以下方法中响应“didFindService”事件,就是找到服务的事件。其中的netService参数就是找到的服务,在netService参数中可以得到服务地址,服务主机名等信息。

 - (void)netServiceBrowser:(NSNetServiceBrowser *)netServiceBrowserdidFindService:(NSNetService *)netService moreComing:(BOOL)moreServicesComing
{}

3.2 如何作为服务端注册Bonjour服务
要注册成为Bonjour服务,开发者可以直接创建NSNetService实例,并通过initwithDomain: type: name: port:方法进行初始化,指定服务的域,类型,名称和端口,样例代码如下:

service = [[NSNetService alloc] initWithDomain:@"local."
type:@"_http._tcp." name:@"DamonWebServer" port:port];

NSNetService创建成功后,可以通过setDelegate指定代理,同时通过publish方法发布注册服务:

        [service setDelegate:self];[service publish];

其中指定的代理需要遵从“NSNetServiceDelegate”协议,可以对服务发布成功,发布失败等事件。
正常来讲,如果需要发布一个服务,需要在发布服务之前准备好服务并启动它。不过NSNetService的publish方法并不依赖它所发布的服务,不管服务是否准备好,是否启动,NSNetService的publish都可以成功将服务发布出去,只不过服务发布出去后其它使用这个服务的客户端会发现这个发布出来的服务是个无效服务。

Bonjour 服务相关推荐

  1. 计算机服务用什么打开,bonjour是什么软件_在win7电脑中打开itunes程序却提示bonjour服务已被禁用怎么办?...

    ====相关推荐==== ====相关推荐==== Itunes程序,想必大家对于这个程序并不陌生吧?特别是对使用IOS系统的用户来说,更是十分熟悉的了!是的,itunes程序就是苹果IOS系统的数字 ...

  2. Android下Bonjour服务的使用

    最近开发的一个互联的应用,需要使用到Android的Bonjour服务.下载了一个544版本的mDNSReponder,经过一阵修改,终于使用Android编译器编译通过,但运行时报: ERROR: ...

  3. windows上Bonjour服务发布的一些坑

    windows上Bonjour服务发布的一些坑 1.遇到的问题 单独发布信息从某个网卡上出去后,会出现自动消失,并且有时会跑到另外一张网卡上 DNSServiceRegister注册服务时回调一直未触 ...

  4. iOS网络编程-iOS中解析Bonjour服务

    服务器端Bonjour服务发布成功之后,客户端可以通过NSNetService解析服务,解析成功后,可以获得通讯的数据细节,如:IP地址.端口等信息. 首先需要实例化NSNetService对象代码如 ...

  5. iOS中解析Bonjour服务(转)

    服务器端Bonjour服务发布成功之后,客户端可以通过NSNetService解析服务,解析成功后,可以获得通讯的数据细节,如:IP地址.端口等信息. 首先需要实例化NSNetService对象代码如 ...

  6. Linux下用Apple的bonjour服务进行摄像机搜索

    Linux下用Apple的bonjour服务进行摄像机搜索 关键词:Linux, bonjour, mDNSResponder, 搜索 1.http://www.opensource.apple.co ...

  7. APPLE Bonjour服务导致公司网络核心Cisco 6509崩溃的案例

    本人小网管一名,毕业后做网络安全(就是管个防火墙.杀毒软件.准入和信息审计啥啥的)1年半多点,去年12月公司唯一的专职网管因为种种原因离职,我被公司调来兼职网管岗位,勉强撑到现在. 先简单介绍一下公司 ...

  8. android自带的nsd发现服务器,Android NSD(网络服务发现)是否与iOS中的Bonjour服务兼容?...

    I will create a server-less local networking App for iOS and Android. the App in both iOS and Androi ...

  9. Visual Studio提示Bonjour backend初始化失败

    Visual Studio提示Bonjour backend初始化失败 错误信息:The Bonjour backend failed to initialize, automatic Mac Bui ...

最新文章

  1. 目标检测 | 盘点目标检测中的特征融合技巧(根据YOLO v4总结)
  2. WebService using Spring throwed org.xml.sax.SAXException: Bad envelope tag: htm
  3. 【 C 】回调函数简记
  4. Node读取并输出txt文件内容
  5. gomod和govendor的简单理解
  6. goland开启go mod管理
  7. tensorflow从入门到放弃(二)
  8. 高级语言程序设计(c )试卷,《高级语言程序设计C》试卷
  9. jzoj2136-(GDKOI2004)汉诺塔【找规律,模拟】
  10. Android 活体人脸实时采集,百度、虹软
  11. java中的等待_Java中更好的等待语法
  12. mysql手工注入imformation_mysql 简单手工注入
  13. helm安装istio_第五章 用Helm部署Istio
  14. 计算机上没有保存任何数据源,Excel数据表找不到链接莫着急——三点操作重建数据的源文件-查看源文件...
  15. hdu 4699 模拟栈
  16. Windows Server 2008 R2部署active directory服务器
  17. fpm工作流程(转)--写的很完整很明白
  18. 中控门禁无法添加设备,提示表结构不存在或接收超时
  19. 【地理】从物理到地理之自然地理提纲整理2——大气圈
  20. 项目经历怎么写_工程监理简历范文,【工作经历+项目经验+自我评价】怎么写...

热门文章

  1. Warning: Function components cannot be given refs
  2. 利用WPT(Windows Performance Toolkit)进行程序的性能分析
  3. Python微信点赞
  4. 无边界安全成新趋势,志翔科技推出首个体系化“无边界”安全产品
  5. Windows-电脑蓝屏问题
  6. 百度名词~杂篇--(对日常遇到事物的深入了解)
  7. 第2课:5G标准小知识
  8. Ecall测试,ITU-T P.1140 车载紧急呼叫系统语音测试
  9. 2019年别离职、别创业、别投资,收藏好这些热点好好干!
  10. css显示苹方字体,苹方字体合集