国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

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.survivalescaperooms.com/qingche/
本文版權歸作者和博客園共有,歡迎轉載,但必須保留此段聲明,且在文章頁面明顯位置給出原文連接。
 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 资溪县| 佛坪县| 伊金霍洛旗| 苏州市| 都兰县| 章丘市| 呼和浩特市| 西安市| 卢氏县| 永德县| 五莲县| 敦煌市| 左云县| 临漳县| 出国| 宁城县| 南京市| 民和| 定西市| 常熟市| 松滋市| 平远县| 德化县| 申扎县| 商河县| 庆云县| 梁河县| 渝北区| 田东县| 云安县| 嫩江县| 天峻县| 达日县| 宜宾县| 惠东县| 松江区| 南川市| 南川市| 随州市| 潮州市| 唐河县|