2012-06-13 60 views
4

我正在研究需要基本客戶端/服務器交互模型的iPhone應用程序。爲此,我將使用Bonjour和NSNetService以及NSNetServiceBrowser來發現同一網絡上的其他人。我跟着幾個不同的指南,或多或少具有相同的示例代碼。NSNetService/Bonjour發現只適用於iPhone模擬器

相關服務器代碼

... 
serverName = [[UIDevice currentDevice] name]; 
netService = [[NSNetService alloc] initWithDomain:@"local." 
              type:@"_myservice._tcp." 
              name:serverName 
              port:port]; 
... 

服務發佈成功,也就是我得到的netServiceDidPublish:回調

相關的瀏覽器代碼

... 
browser = [[NSNetServiceBrowser alloc] init]; 
[browser setDelegate:delegate]; 
[browser searchForServicesOfType:@"_myservice._tcp." 
         inDomain:@"local."]; 
... 

現在的這一切結果很有趣:

  1. 在iPhone上運行時,設備只能看到自己發佈的NSNetService。
  2. 在2臺iPhone上運行,兩臺設備都無法看到對方的NSNetService。
  3. 運行在iPhone模擬器上,它會發現所有的 NSNetServices,包括它自己的。 iPhone模擬器enter image description here

截圖我在虧損還算是這裏...該模擬器工作完全按預期。然而,在設備上它不是,我不能在同一個WiFi上看到2個不同的iPhone來看對方,他們只看到自己。任何想法發生了什麼?

+0

您可以嘗試從商店購買免費的Bonjour瀏覽器應用程序,以驗證它不是網絡中的連接問題,即阻塞的端口(5353)。 – nobre

+0

我試過在OSX和iOS上免費的Bonjour瀏覽應用程序。在OSX上它發現我發佈的所有服務。使用手機上的瀏覽器應用程序無法找到任何服務。我開始認爲我錯過了一個額外的配置步驟來啓用設備上的發現。 – nrj

回答

2

原來,我所在的路由器默認啓用了「SPI防火牆」。解決這個問題。

有一件事我仍然很好奇:來自我的Mac的請求,iPhone模擬器和Bonjour瀏覽器如何能夠通過這個防火牆,但是3個不同的iPhone卻沒有?

+1

Mac上的模擬器和瀏覽器本身?在這種情況下,流量永遠不會離開計算機(它在「環回」接口上廣播),因此路由器無法阻止它。 –

+0

啊,這很有道理。謝謝! – nrj

相關問題