麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

iOS-Apple零配置網絡協議Bonjour的使用?

2019-11-14 19:53:12
字體:
來源:轉載
供稿:網友

1.前言  

這段時間為了解決公司App的網絡離線需求,做了個Apple推出的零配置網絡協議Bonjour的Test,主要是為了解決iOS設備的ip獲取,之前是可以使用socket的廣播來實現,但是使用Apple推出的Bonjor相比會更加簡單和穩定。希望能對大家有點幫助,如果有什么地方有error也歡迎大家指出,互相學習。
 
這是之前寫過的一篇關于socket的blog——socket廣播
 

2.什么是Bonjour?能做些什么?  

相信沒有了解過Bonjour的朋友對這個東西會比較陌生,Bonjor如標題所言,是Apple退出的一種零配置網絡協議,Bonjour可以完成的工作主要是在缺少中心服務器的情況下解決IP獲取,名稱解析和服務發現這三個問題。
 

2.1 IP獲取  

在傳統網絡環境下,設備的IP地址通過兩種方式獲取,一種是靜態配置,通過手工方式為設備指定一個IP地址,一種是動態配置,設備通過路由器的DHCP服務獲得動態的IP地址。
在無中心服務器的網絡環境下,沒有中心服務器提供DHCP服務,用戶手工配置IP地址也很不方便,這就需要一種新的方式來幫助設備獲取IP地址,就是希望設備可以主動為自己指定一個可用的IP地址。
在IPV6環境下,IPV6協議本身就提供了設備自指定IP地址的能力,所以實現很簡單,直接使用IPV6的協議支持就可以了。
在IPV4環境下,Bonjour使用了隨機指定IP地址的方法,首先為設備隨機指定一個屬于本地網段的IP地址,然后檢查該地址在本地是否有沖突,如果有沖突就隨機生成另一個新的IP地址,直到找到可用IP地址為止。
 

2.2 名稱解析  

在傳統網絡環境下,名稱和IP地址的對應關系是通過DNS服務解析的。當一個設備需要訪問一個域名,如“www.saup.com”,設備將“www.saup.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地址是什么。
 

3.Bonjour的使用?  

Bonjour的使用主要分為兩部分

3.1.Bonjour服務端注冊服務  

//首先我們需要使用到iOS SDK里的NSNetService類@PRoperty(strong,nonatomic)NSNetService*netService;
//初始化服務,指定服務的域,類型,名稱和端口   _netService = [[NSNetService alloc] initWithDomain:@"local." type:@"_http._tcp." name:@"DamonWebServer" port:5222];
//指定代理[_netServicesetDelegate:self];//發布注冊服務[_netService publish];
//NSNetServiceDelegate代理協議相關代理方法  按需求使用@protocolNSNetServiceBrowserDelegate <NSObject>@optional/* Sent to the NSNetServiceBrowser instance's delegate before the instance begins a search. The delegate will not receive this message if the instance is unable to begin a search. Instead, the delegate will receive the -netServiceBrowser:didNotSearch: message.*/- (void)netServiceBrowserWillSearch:(NSNetServiceBrowser*)aNetServiceBrowser;/* Sent to the NSNetServiceBrowser instance's delegate when the instance's previous running search request has stopped.*/- (void)netServiceBrowserDidStopSearch:(NSNetServiceBrowser*)aNetServiceBrowser;/* Sent to the NSNetServiceBrowser instance's delegate when an error in searching for domains or services has occurred. The error dictionary will contain two key/value pairs representing the error domain and code (see the NSNetServicesError enumeration above for error code constants). It is possible for an error to occur after a search has been started successfully.*/- (void)netServiceBrowser:(NSNetServiceBrowser*)aNetServiceBrowser didNotSearch:(NSDictionary*)errorDict;/* Sent to the NSNetServiceBrowser instance's delegate for each domain discovered. If there are more domains, moreComing will be YES. If for some reason handling discovered domains requires significant processing, accumulating domains until moreComing is NO and then doing the processing in bulk fashion may be desirable.*/- (void)netServiceBrowser:(NSNetServiceBrowser*)aNetServiceBrowser didFindDomain:(NSString*)domainString moreComing:(BOOL)moreComing;/* Sent to the NSNetServiceBrowser instance's delegate for each service discovered. If there are more services, moreComing will be YES. If for some reason handling discovered services requires significant processing, accumulating services until moreComing is NO and then doing the processing in bulk fashion may be desirable.*/- (void)netServiceBrowser:(NSNetServiceBrowser*)aNetServiceBrowser didFindService:(NSNetService*)aNetService moreComing:(BOOL)moreComing;/* Sent to the NSNetServiceBrowser instance's delegate when a previously discovered domain is no longer available.*/- (void)netServiceBrowser:(NSNetServiceBrowser*)aNetServiceBrowser didRemoveDomain:(NSString*)domainString moreComing:(BOOL)moreComing;/* Sent to the NSNetServiceBrowser instance's delegate when a previously discovered service is no longer published.*/- (void)netServiceBrowser:(NSNetServiceBrowser*)aNetServiceBrowser didRemoveService:(NSNetService*)aNetService moreComing:(BOOL)moreComing;

 3.2.Bonjour客戶端發現本地服務  

//客戶端主要使用的是iOS SDK里的NSNetServiceBrowser@property(strong,nonatomic)NSNetServiceBrowser*serverBrowser;@property(strong,nonatomic)NSMutableArray*servers;//NSNetService在客戶端用于解析@property(strong,nonatomic)NSNetService*netserver;//初始化NSNetServiceBrowser_serverBrowser= [[NSNetServiceBrowseralloc]init];//指定代理_serverBrowser.delegate = self;_servers = [NSMutableArrayarray];//查找服務接著使用NSNetServiceBrowser實例的searchForServicesOfType方法查找服務,方法中可以指定需要查找的服務類型和查找的域[_serverBrowsersearchForServicesOfType:@"_http._tcp."inDomain:@"local."];

NSNetServiceBrowserDelegate代理協議相關代理方法

注:客戶端可以通過NSNetService解析服務,解析成功后,可以獲得通訊的數據細節,如:IP地址、端口等信息。 
-//下面是幾個常用的代理方法
//即將解析服務,- (void)netServiceWillResolve:(NSNetService *)netService {       NSLog(@"netServiceWillResolve");   }//解析服務成功- (void)netServiceDidResolveAddress:(NSNetService *)netService {       NSLog(@"service ip:%@,------port:%d",netService.addresses,netService.port);       } //解析服務失敗,解析出錯- (void)netService:(NSNetService *)netService didNotResolve:(NSDictionary *)errorDict {       NSLog(@"didNotResolve: %@",errorDict);   }  //已發現服務- (void)netServiceBrowser:(NSNetServiceBrowser *)netServiceBrowser didFindService:(NSNetService *)netService moreComing:(BOOL)moreServicesComing{       NSLog(@"didFindService");    _netserver = netService;    _netserver.delegate = self;    //設置解析超時時間    [_netserverresolveWithTimeout:5.0];}

 

作者: 清澈Saup
出處: http://www.companysz.com/qingche/
本文版權歸作者和博客園共有,歡迎轉載,但必須保留此段聲明,且在文章頁面明顯位置給出原文連接。
 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 亚洲第五色综合网 | 欧美亚州 | 欧美a级大胆视频 | 欧美亚洲国产成人 | 成年人精品视频 | 鲁人人人鲁人人鲁精品 | 国产精品啪一品二区三区粉嫩 | a级欧美| 国产精品久久久久久久久久电影 | 国产一级毛片网站 | 国产羞羞视频在线免费观看 | 久久久久久久一区 | 久草在线最新免费 | 久久国产精品免费视频 | 在线观看国产一区二区三区 | 一级黄色免费观看视频 | 粉嫩粉嫩一区二区三区在线播放 | 亚洲最黄视频 | 欧美成人黄色小视频 | 欧美性生交zzzzzxxxxx | 99亚洲| 亚洲国产精品久久久久制服红楼梦 | 国产精品夜色视频一级区 | 国产羞羞视频在线免费观看 | 久久福利小视频 | 最新午夜综合福利视频 | 12av毛片 | 中文字幕伦乱 | 久久久久久麻豆 | 大学生一级毛片在线视频 | 91色一区二区三区 | fc2国产成人免费视频 | 一级国产电影 | 久草成人在线 | 视频一区二区精品 | 黄色大片大毛片 | 亚洲精品无码不卡在线播放he | 999久久国精品免费观看网站 | 日韩精品二区 | 成人免费乱码大片a毛片视频网站 | 91久久极品少妇韩国 |