Bonjour (苹果电脑公司的服务器搜索协议),使用不需要导入任何框架
一.Bonjour介绍

1、简介
一般在进行Socket编程或者网络访问的时候,首先需要确认对方网络服务已经开启,且需要知道对方的域名或地址以及端口,然后才可以进行进一步操作。在互联网上好点,网络服务方一般常年开启,且一般IP地址是固定的,另由于DNS服务的存在,只要记住对方的域名便可以。但是在局域网,设备不一定连在上面,即使连上了,服务也不一定开了,每当设备连接到局域网的时候,IP地址一般都是动态分配的,所以情况变的复杂。
Bonjour的存在便是苹果为了解决局域网设备间连接麻烦的问题。
Bonjour是一种协议(苹果递交给IETF的开放协议),使得局域网中的计算机可以方便的发布服务,发现服务和连接服务,达到零配置(http://zeroconf.org)的目的。

2、零配置网络服务
Zeroconf Working Group指出要实现零配置网络服务的3个要求:

1)、IP地址
2)、名字 到 IP地址 的转换(即使没有DNS服务器的情况下)
3)、发现网络中的服务
第一个要求,相关系统和设备可以直接支持的,如动态IP地址分配。
第二个要求,则可以通过多播(UDP协议向局域网内一组机器发送数据)的方式发送类似DNS查询的请求,开启着的网络服务收到之后便作出回应,告知自己的名字。
第三个要求则通过DNS-SD来实现

3、Bonjour的特点 —— 使局域网自行配置
不需要管理
不需要DHCP服务器来分配地址
不需要DNS服务器来映射名字到地址
不需要目录服务器来查找服务

4、Bonjour的工作模式

1)、发布服务。
在同一局域网中,服务器方开启服务,通过Bonjour接口将这个服务发布;

2)、浏览服务。
服务搜索方在服务列表中可以看到发布服务的设备的名字;

3)、连接服务。
服务搜索方选择想要连接的设备,便可以进行连接了。

整个过程中,无需实现知道服务发布方的IP地址和端口号。
我们常用的软件如iTunes的共享,keynote的remote控制或者支持Bonjour协议的打印机都可以看到Bonjour的影子。

二.如何自动分配地址
1、Bonjour挑选一个随即的地址,检查是否被使用
如果没有被使用,就给你用
如果被使用了,再试
2、使用”.local.”作为一个虚拟的顶层域名
3、对服务的广告
应用程序提供一个服务名和端口
遵循和DNS同样的模型——“具体到一般”
服务名._服务类型._传输协议名.域名
1)、服务名:是一个人可以阅读的描述性的名字
最多63个UTF-8字符
所有字符都允许
2)、_服务类型:是一个在IANA注册过的协议名,也可以用一串自定义的字符串
最多14个字符
格式是[a-z0-9]([a-z0-9\-]*[a-z0-9])?
3)、_传输协议名:TCP或者UDP,不支持自己的协议

例如:
Canon MP780._ipp._tcp.local.
服务名称:Canon MP780
服务类型:_ipp(Internet Printing Protocol——网络打印协议)
协议:_tcp
域名 local.
MyService._test._tcp.local.
服务名: MyService
服务类型:_test(未注册过的协议名,自定义的字符串)
协议:_tcp
域名local.

三.Bonjour的实现及使用
从上面的描述可以看出,Bonjour的用途便是在局域网内发布服务和搜索服务。
下面从实现层面讲解Bonjour。

层次
名称
Foundation
NSNetService/NSNetServiceBroswer
CoreFoundation
CFNetService/CFNetServiceBroswer
Low-Level Socket Based API
dns_sd.h(The DNS Service Discovery API)

一般情况下我们使用Foundation这一层接口就可以了,也是最方便的。
当然服务方在发布服务之前你得先启好网络服务,比如listening socket创建好,且开始侦听某个端口。

1、发布服务 ( NSNetService )
NSNetService * _netService;
_netService = [[NSNetService alloc] initWithDomain:@"local" type:@"_Test._tcp" name:@"_Test" port:53794];
_netService.delegate = self;
[_netService publish];

域名和name可以为缺省,直接传入参数@””,
域名为空白:暗示为 “ .local.”
name为空白:使用设备的iTunes名称

//且需要在dealloc里去掉delegate,停止服务
- (void)dealloc
{
_netService1.delegate = nil;
[_netService1 stop];
[_netService1 release];
[super dealloc];
}

常用代理方法
- (void)netServiceWillPublish:(NSNetService *)sender;
//成功后调用, 发布几个服务,会被调用几次
- (void)netServiceDidPublish:(NSNetService *)sender{
NSLog(@"发布Bonjour服务成功:domain(域名) = %@,type = %@,name = %@,port(端口) = %i",[sender domain],[sender type],[sender name],(int)[sender port]);
}
//发布服务失败调用,errorDict类似一个NSError有2个值,一个是错误域名,另一个是错误号码
- (void)netService:(NSNetService *)sender didNotPublish:(NSDictionary *)errorDict;

2、浏览服务 ( NSNetServiceBrowser )
NSNetServiceBrowser * _netServiceBrowser;
_netServiceBrowser = [[NSNetServiceBrowser alloc] init];
_netServiceBrowser.delegate = self;
[_netServiceBrowser searchForServicesOfType:@"_Test._tcp" inDomain:@""];

常用代理方法
- (void)netServiceBrowserWillSearch:(NSNetServiceBrowser *)aNetServiceBrowser;
- (void)netServiceBrowserDidStopSearch:(NSNetServiceBrowser *)aNetServiceBrowser;
- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didNotSearch:(NSDictionary *)errorDict;

//开始搜索指定type和domain的service,也就是调用searchForServicesOfType: inDomain:系统会调用下面的代理方法。
//搜索到几个服务,调用几次,当所有服务搜索完,moreComing会为NO,否则为YES
- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindService:(NSNetService *)aNetService moreComing:(BOOL)moreComing

{

NSNetService * lastService = [_serviceArray lastObject];
//开始搜索不同type的service了
if (![[lastService type] isEqual:[aNetService type]]) {

[_serviceArray removeAllObjects];
}

[_serviceArray addObject:aNetService];

if (moreComing == NO) {//指定类型的服务全部搜索完成了
[self.tableView reloadData];
}
}

//当所有指定服务remove完成,moreComing会为NO,否则为YES
- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didRemoveService:(NSNetService *)aNetService moreComing:(BOOL)moreComing;

3、连接服务 ( NSNetServiceBrowser 找到的 NSNetService )
上面发现的NSNetService是不带IP地址和端口信息的,使用前必须解析他们的地址。
从服务列表中选择一个已经发现的服务,进行Resolve,便可以获取服务的详细信息了。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
//连接选中服务
NSNetService * aNetService = [_serviceArray objectAtIndex:indexPath.row];
aNetService.delegate = self;
//连接发现的service,5秒后超时
[aNetService resolveWithTimeout:5.0];
}

常用代理方法
//Resolve成功后调用
-(void)netServiceDidResolveAddress:(NSNetService *)sender;

-(void)netService:(NSNetService *)sender didNotResolve:(NSDictionary *)errorDict;
- (void)netServiceDidResolveAddress:(NSNetService *)sender;

Bonjour (苹果电脑公司的服务器搜索协议)相关推荐

  1. Bonjour(苹果电脑公司的服务器搜索协议商标名)

    Bonjour是在LAN(局域网)中寻找服务的一个主要方法.这项技术广泛用于Mac OS X,允许用户不用在任何设置下建立一个网络连接.目前用于在Mac OS X和其他操作系统上寻找打印机和文件共享服 ...

  2. 【历史上的今天】4 月 1 日:首届图灵奖的获得者诞生;苹果电脑公司成立;Gmail 问世

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2022 年 4 月 1 日,在 1972 年的今天,英特尔(Intel)发布了世界上第一款八位元(Bit)处理器 ...

  3. 苹果电脑用不用TCP/IP协议?

    文章目录 一.从一道题开始: 二.AppleTalk是什么? 一.从一道题开始: 这道题的答案选择A,现在,你在市面上几乎找不到一款不支持TCP/IP的操作系统了, 所以 Windows和MacOS都 ...

  4. 苹果电脑QQ邮件服务器,mac电脑如何添加qq邮箱图文教程

    在mac电脑中,默认是没有qq邮箱的,如果我们想要在mac电脑中添加邮箱,那么,需要哪些操作呢?下面就让学习啦小编告诉你mac电脑添加qq邮箱的图文教程. mac电脑添加qq邮箱的方法 建议您在偏好设 ...

  5. 苹果电脑 不能使用服务器发送邮件,解决Mac上无法使用的邮件问题的技术

    这是您需要的最后一件事. 的问题 邮件在Mac上不起作用 会让你发疯想像一下,您是否无法在需要时接收和发送电子邮件? 你要做什么 对于初学者,不要惊慌. 您可以对此做些事情. 本文将向您展示在Mac上 ...

  6. 苹果电脑如何修改服务器文件在哪里设置,电脑服务器修改mac地址

    电脑服务器修改mac地址 内容精选 换一换 域名解析不生效的表现是使用ping命令无法获取正确的域名解析IP地址.解析不生效的原因包括:本地网络故障云解析服务器的解析记录异常域名解析记录在DNS被修改 ...

  7. 苹果电脑怎么查看服务器信息,苹果电脑上如何查看BT种子文件的详细信息

    Folx是一款综合型的面向MacOS系统的下载管理器,具有Mac风格的用户界面,提供便捷的下载管理以及灵活的设置等.尤其在BT下载方面,可以说Folx已经是一款名副其实的BT专业下载软件,能替代uTo ...

  8. 苹果电脑显示500服务器错误,VS For Mac 运行项目出现 HTTP 500错误

    异常堆栈跟踪:在Cwj.NNFext.Init.ExpendRes()[0x00054]在(包装器托管到本机)System.Reflection.RuntimeMethodInfo.InternalI ...

  9. vnc改ip_苹果电脑远程控制设置screen sharing(VNC)网络端口修改

    苹果电脑远程控制设置screen sharing(VNC)网络端口修改事前需要先确定被远程的mac网络是公网ip 如果不需要改远程端口的请从第6步开始打开launchpad找到others--> ...

最新文章

  1. Clion 远程开发 配置
  2. 23 版本以上的v4包_Ant Design Pro V2升级到V4 小结
  3. java规约下载_Java规约 PDF 下载
  4. 迷你世界维护服务器几点到几点,迷你世界服务器房间是什么 | 手游网游页游攻略大全...
  5. 微信「看一看」 朋友在看的增强推荐系统
  6. Aspose.Cells使用总结大全
  7. [深度学习]人脸检测-Tensorflow2.x keras代码实现
  8. 解决qt程序运行时的cannot create Qt for Embedded Linux data directory: /tmp/qtembedded-0
  9. 好系统教你如何禁用或删除启动应用程序以加速Windows
  10. android html5小游戏源代码,HTML5小游戏源代码大全(300M)
  11. 10 Java 常见的加密方式
  12. access ea 可以联网吗_如何看待EA在STEAM上推出EA Play(原EA Access会员)?
  13. 爬虫——八爪鱼采集器
  14. 【DPD数字预失真】射频功放的Volterra级数数字预失真系统开发
  15. 【深度学习框架体系的学习】pytorch
  16. 项目非组件文件进行路由跳转【react与vue等其他框架均可使用】
  17. OpenCV第六篇:阈值函数
  18. 远程语音 开源_通过开源语音聊天简化远程会议
  19. 单片机中时延函数易常范的错误
  20. DROID-SLAM: Deep Visual SLAM for Monocular, Stereo, and RGB-D Cameras论文阅读笔记

热门文章

  1. 基于层次分析法的“内卷”指数分析
  2. 文档不小心关闭但没保存怎么办?(WPS Office)
  3. 【图雀早报】2020年6月8日星期一
  4. 罗振宇2018年“时间的朋友”跨年演讲知识精华汇总
  5. xshell和xftp官网申请免费版本(什么年代都能使用)
  6. 干货——生产型企业的供应商管理系统模板
  7. qq阅读java带签名_手机QQ阅读器Java触屏且签名版
  8. Visual C++斗地主游戏网络版源代码
  9. 让chatGPT 作为 面试官 / 辩手 / 演说家 / 哲学家 / SQL终端的 Prompt 命令
  10. 开hash与闭hash