2014-09-05 97 views
1

我有點新的Objective-C /可可,我正在努力編寫一個bonjour服務器客戶端應用程序。 由於我沒有太多經驗,如果您的回覆也可以包含關於如何操作的解釋,而不僅僅是代碼,我將不勝感激。如何在客戶端斷開連接時獲取NSNetService通知?

我設法使用服務器的netService:didAcceptConnectionWithInputStream:outputStream方法在服務器和客戶端之間建立連接和輸入輸出流。

事情是,我希望服務器有一個所有連接客戶端的列表。 我知道客戶端的NSNetServiceBrowserDelegate有一個方法,在與bonjour服務的連接結束時會被吊銷, 但我無法找到一個與我在服務器端可以使用的NSNetServiceDelegate相同的方法來運行適當的客戶端斷開連接時的代碼。

+0

這就是關於那個點的流。 – uchuugaka 2014-09-05 09:41:05

+0

是不是有一種「活」的方式來知道?我的意思是,如果我指望流,唯一一次我知道客戶端斷開連接的時候是我嘗試使用他的流時。 – AMI289 2014-09-05 14:35:14

回答

0

查看Stream Programming Guide。 基本上,你將使用NSStream(或它的一個子類),你需要創建一個委託給你的流。 流代表應該處理的一種方法 - 流:爲handleEvent: 這個方法是一個回調,會給你NSStreamStatus下列指示(一個通過typedef NSUInteger)的一個

typedef enum { 
    NSStreamStatusNotOpen = 0, 
    NSStreamStatusOpening = 1, 
    NSStreamStatusOpen = 2, 
    NSStreamStatusReading = 3, 
    NSStreamStatusWriting = 4, 
    NSStreamStatusAtEnd = 5, 
    NSStreamStatusClosed = 6, 
    NSStreamStatusError = 7 
}; 

在您的實現委託方法你基本上創建一個switch-case語句,它可以做任何你需要做的事情來響應這個變化。

+0

謝謝你的回覆。我已經嘗試過,在netService:didAcceptConnectionWithInputStream:outputStream:我將inputStream.delegate和outputStream.delegate設置爲self,但是stream:handleEvent:方法的非回調被取消。也許它與自動回收有關? – AMI289 2014-09-06 08:57:27

+0

如果我沒有記錯,可能有NSStream API需要在同一個線程或runloop上的事情。我忘了。 CFStream更難但更靈活和線程安全。但是你可以通過查找一些有效的示例代碼來分解它。它確實有效,你只是在某處丟失了某些東西。 – uchuugaka 2014-09-06 09:14:05

+0

如果我創建一個包含流數據的新類,我已經設法讓委託工作。但除了NSStreamStatusOpen和NSStreamStatusClosed之外,沒有方法被調用。在Xcode的文檔中,NSStream的typedef與您發佈的不同。 – AMI289 2014-09-14 14:34:51

相關問題