iOS开发:什么是Bonjour

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


这两天抽空做了几个 Bonjour的测试,将我的理解整理了一下和大家分享,希望对大家的工作有帮助,同时,有理解错误的地方也请大家校正。

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

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

2.1 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协议的,不过 BonjourmDNS协议上作了扩展,加强了设备响应 组播 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地址是什么。

3. 如何使用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 *)netServiceBrowser didFindService:( 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都可以成功将服务发布出去,只不过服务发布出去后其它使用这个服务的客户端会发现这个发布出来的服务是个无效服务。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值