我试图编写基于CocoaEcho示例的客户端(iPad)/服务器(iMac)应用程序。 我的第一个简单的例子工作,但添加更多的function后,客户端无法find服务器。 启动服务器后,我启动客户端,都在本地networking。 客户端开始search服务,并为其浏览器获取“netServiceBrowserWillSearch:”消息,但之后没有任何反应。 再次触发对服务的search,导致出现错误-72003,10(浏览器仍在忙于search)的“didNotsearch:”消息。 1)我检查了服务器与WiTap应用程序可达。 有客户端和服务器连接正确。 2)我检查是否服务器发布“dns-sd -B _cocoaecho”的服务,它被检测到。 3)客户端应用程序中的nsnetservicebrowser对象被声明为一个属性,所以不应该有一个范围问题。 我也检查了debugging器,它仍然存在…. 我的代码: 客户: @interface MySocketClient : UIResponder <NSNetServiceBrowserDelegate, NSStreamDelegate> { … NSNetService * myServer; NSString* nextMsg; } @property (nonatomic, strong, readwrite) NSMutableArray * services; // of NSNetService @property (nonatomic, strong, readwrite) NSNetServiceBrowser * serviceBrowser; @property (nonatomic, strong, readwrite) NSInputStream * inputStream; @property (nonatomic, strong, […]
我正在使用Bonjour(NSNetServiceBrowser,准确地说)通过WiFi在我正在开发的一个iOS项目开发的应用程序。 但是,尽pipe注意到NSNetServiceBrowser为什么在iPhone OS中find未发布的服务的优秀响应中提出的问题? 我仍然遇到与NSNetSericeBrowser的一些困难。 我的设置如下: 使用运行iOS 4.5.3的iPad。 使用AirPort Express作为接入点/路由器。 在连接到networking的Mac上运行dns-sd -B _serviceName可以正常工作 – 也就是说,所有发布和停止的调用都立即反映在桌面上。 但是,我遇到以下问题: 长时间发布的服务(大约15分钟+)往往不会被客户端删除, 即使它们从Mac上消失! (即didRemoveService不会被调用)。 有时,发布的服务在networking上不会被其他人看到, 即使它们出现在Mac上也是如此! (即didFindService未调用) – 这可能与下面3/4点有关…因此,如果应用程序在iPad连接到networking之前开始运行(并search),则它不search新networking正常。 如果设备在发布服务后更改networking,会发生什么情况? 我发现Bonjour不会在新的networking上重新发布服务 – 如何才能迫使这种情况发生呢? 如果设备在search服务时更换networking会发生什么情况? 我发现这也会导致问题,并且往往会导致找不到会话(didFindService未被调用)。 我遇到的问题很奇怪,因为Bonjour 90%的时间工作…只是10%,这是破坏我的应用程序的可靠性! 烦人的是,所有上述问题都可以通过双击主页button并强制closures应用程序,然后重新运行来解决。 再次运行后,它总是find正确的会话或正确发布。 避免这个问题的一个方法是拆卸并重新启动NSNetServiceBrowser,只要无线networking改变了…但是这看起来很混乱,没有必要。 令人沮丧的是,Bonjour是一个高级API,没有任何实际的选项来进行调整和testing。 任何想法我怎么能解决问题1-4? 谢谢!
我已经使用GCDAsyncsocket库编写了一个Singleton类,用于使用Bonjourbuild立与具有相同服务的任何其他设备的连接。 在一台设备上,我使用其方法“ startPublishing ”使其成为主机(服务器),从另一台设备(客户机)上的应用程序调用“ StartBrowsing ”来查找可用的networking设备。 当用户select该networking中的任何服务时,我正在调用方法“ initConnectionWithService ”,通过parsingNetService的地址来启动连接stream程来连接。 BonjourUtilClass.h @interface BonjourUtilClass : NSObject<GCDAsyncSocketDelegate,NSNetServiceDelegate,NSNetServiceBrowserDelegate>{ NSNetService *netServiceToPublish; GCDAsyncSocket *socketPub; NSNetServiceBrowser *netServiceToBrowse; GCDAsyncSocket *socketSub; NSMutableArray *mutArrServices; GCDAsyncSocket *socketConnected; } +(id)sharedInstance; -(void)startPublishing; -(void)startBrowsing; -(void)initConnectionWithService:(NSNetService*)netServiceToConnect; -(void)disconnectWithCurrent; @end BonjourUtilClass.m static BonjourUtilClass *sharedObject = nil; @implementation BonjourUtilClass +(id)sharedInstance{ if(!sharedObject){ sharedObject = [[BonjourUtilClass alloc]init]; } return sharedObject; } #pragma mark – Browsing […]