2014-09-05 3 views
1

저는 Objective-C/Cocoa에 좀 익숙하며, bonjour 서버 - 클라이언트 응용 프로그램을 작성하려고합니다. 많은 경험이 없으므로 답장에 코드뿐만 아니라 어떻게 수행하는지에 대한 설명이 포함되어 있으면 감사히 생각합니다.클라이언트가 연결을 끊었을 때 NSNetService에 알리는 방법은 무엇입니까?

서버의 netService:didAcceptConnectionWithInputStream:outputStream 메서드를 사용하여 서버와 클라이언트 사이에 연결 및 입출력 스트림을 설정할 수 있습니다.

문제는 서버가 연결된 모든 클라이언트의 목록을 갖기를 원합니다. 나는 클라이언트의 NSNetServiceBrowserDelegate가 봉쥬르 서비스와의 연결이 끝날 때마다 취소되는 메서드를 가지고 있음을 알고있다. 그러나 적절한 방법을 실행하기 위해 서버 측에서 사용할 수있는 NSNetServiceDelegate이라는 동일한 메서드를 찾을 수 없다. 클라이언트가 연결을 끊을 때 코드.

+0

그 시점에서 모든 것이 스트림입니다. – uchuugaka

+0

그걸 알 수있는 "살아있는"방법이 있습니까? 내 말은, 내가 스트림에 의지한다면, 클라이언트가 연결 해제되었음을 알 수있는 유일한 시간은 그의 스트림을 사용하려고 할 때뿐입니다. – AMI289

답변

0

Stream Programming Guide를 확인하십시오. 기본적으로 NSStream (또는 그 하위 클래스)을 사용할 것이므로 스트림에 대리자를 만들어 지정해야합니다. 스트림 대표는 하나의 방법을 처리해야 - 스트림 :의 handleEvent을 : 그 방법은 당신에게 대리자 메서드의 구현에

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

NSStreamStatus의 다음 표시 (A typedefed NSUInteger) 중 하나를 줄 것이다 콜백 당신 기본적으로 switch-case 문을 작성하여 변경에 대한 응답으로 수행해야하는 모든 작업을 수행합니다.

+0

답장을 보내 주셔서 감사합니다. netService : didAcceptConnectionWithInputStream : outputStream : inputStream.delegate 및 outputStream.delegate를 자체로 설정했지만 스트림이 아닌 : handleEvent : 메서드가 취소되었습니다. autoreleasing과 관련이있을 수 있습니까? – AMI289

+0

올바르게 기억한다면 NSStream API가 동일한 스레드 또는 runloop에 있어야 할 필요가있을 수 있습니다. 잊었다. CFStream은 훨씬 어렵지만 유연하고 스레드 안전합니다. 그러나 작동중인 샘플 코드를 찾아 내면 문제를 해결할 수 있습니다. 어딘가에 뭔가 놓친 것만으로도 효과가 있습니다. – uchuugaka

+0

스트림 데이터를 보유하는 새 클래스를 만들면 위임을 사용할 수 있습니다. NSStreamStatusOpen과 NSStreamStatusClosed 이외에 메소드가 호출되지 않습니다. 그리고 Xcode의 문서에서 NSStream의 typedef는 게시 한 것과 다릅니다. – AMI289

관련 문제