2010-03-07 3 views
1

Java에서 Bonjour를 사용하려고합니다. 나는 그것을하는 방법의 예를 발견했고 나는 그것을 이해했다고 생각한다. 그러나 나는 왜 그렇게 복잡한 방식으로해야하는지 이해하지 못합니다. 나는 무엇인가 놓칠지도 모른다.왜 그렇게 복잡한 방식으로해야합니까? OOP 사고 방식인가요?

따라서 code I found은 다음과 같은 방식으로 작동합니다 (코드도 아래에 나와 있습니다).

    Java 프로그램이 서비스를 찾을 수 및 서비스가 발견되면 시도

  1. , 프로그램 서비스 (I "는 서비스를 해결하기 위해"생각이 연결 "또는"서비스를 이용하려면 "의미"해결 "을 시도 서비스에 ").

  2. 발견 된 서비스를 "해결하려면" "DNSSD.resolve"메서드를 호출해야하며이 메서드의 마지막 인수로 개체를 제공해야합니다.

  3. "DNSSD.resolve"가 주어진 서비스를 해결하려고 시도합니다. "DNSSD.resolve"가 서비스를 해결할 수있는 경우 마지막 인수로 제공된 인스턴스의 "serviceResolved"메소드를 호출합니다. "DNSSD.resolve"가 서비스를 해결할 수없는 경우, ti는 위에서 언급 한 객체의 "operationFailed"메소드를 호출합니다.

    DNSSD.resolve(0, ifIndex, serviceName, regType, domain, new ResolveListener(){ 
           public void serviceResolved(DNSSDService resolver, int flags, int ifIndex, 
           String fullname, String hostname, int port, TXTRecord txtRecord){ 
            InetAddress theAddress; 
            try { 
             theAddress = InetAddress.getByName(hostname); 
            } catch (UnknownHostException e) { 
             // ouch.. 
            } 
           } 
    
           public void operationFailed(DNSSDService arg0, int arg1) { 
            // ouch, again! 
           } 
          }); 
    

    다음과 같은 방법으로 코드를 구성 할 수 없습니다 간단 할 것이다 : 여기

는 코드입니다.

  1. "DNSSD.resolve"메소드를 해결하려는 서비스에 대한 정보와 함께 호출합니다.

  2. "DNSSD.resolve"에 개체를 전달하지 않습니다.

  3. "DNSSD.resolve"는 어떤 클래스의 메서드도 호출하지 않습니다.

  4. "DNSSD.resolve"는 제공된 서비스를 "확인"하려고 시도하고 수행 할 수있는 경우 "DNSSD.resolve"가 true를 반환합니다. 그렇지 않은 경우는 false를 리턴합니다.

  5. 프로그램은 "DNSSD.resolve"가 반환 한 값에 따라 "serviceResolved"또는 "operationFailed"메소드를 실행합니다.

아니면 그냥 OOP 사고 방식에 익숙하지 않았습니까?

답변

4

"비동기식 사고 방식"과 같은 "OOP 방식"이 아닙니다. 시간이 걸릴 수있는 작업에 콜백 함수를 사용하면 작업 완료를 기다리는 동안 다른 작업을 수행하거나 GUI 응답을 유지할 수 있습니다.

+0

이 "병렬 처리"는 어떤 시점에서 소개됩니까? 어떤 순간에 프로그램은 DNSSD.resolve를 호출하고 DNSSD가 서비스를 해결할 때까지 호출 프로그램이 대기해야한다고 생각했습니다. – Roman

+1

아니요. 해상도가 아직 완료되지 않은 경우에도 DNSSD.resolve()가 즉시 반환됩니다. 프로그램은 GUI 루프를 처리하는 메인 루프로 되돌아 갈 수 있습니다. 해상도가 끝나면 핸들러 객체는 별도의 스레드에서 호출되며 스레드의 결과를 사용하여 작업하거나 GUI 스레드로 메시지를 대기시켜 결과를 표시 할 수 있습니다. – Wyzard

2

해당 코드는 Java -> JNI -> C 코드입니다. 그것에 대해 아무 것도 없습니다. Java 래퍼가있는 비동기 절차 코드입니다.

+0

어떻게 알 수 있습니까? "async"입니까? 무엇이 "비동기"가 되었습니까? – Roman

+0

코드를 호출하고 결과가 동 기적으로 대기하는 대신 작업이 완료 될 때 호출 할 함수를 지정하십시오. 이 Java 래퍼가 호출하는 Apple C 코드를 살펴 보았습니다. –

4

물론 "문제"에 접근하는 방법에는 여러 가지가 있습니다. 여기서 취하는 접근법은 콜백 접근법입니다. resolve 메소드를 호출하고 메소드를 전달합니다 (실제로는 메소드가 포함 된 객체입니다. Java에 익명 메소드 또는 클로저가 없으므로 ...). 해결사가 해결하기를 원하는대로 성공적으로 해결하면 (완료되지 않은 경우) 제공된 serviceResolved 메서드를 호출합니다 (그러면 해결자가 제공하는 정보로 무언가가 수행됩니다).

즉 비동기 방식이지만 OO는 아닙니다. 리졸버가 "작동 중"이면 다른 작업을 수행 할 수 있으며 serviceResolved 메서드는 어둡게이므로 기다릴 필요가 없습니다.

+0

"어떻게하면 해결사가 일하는 동안 다른 일을 할 수 있습니까?" 메소드를 호출하면 메소드가 메소드를 완료 할 때까지 가중치를 적용하고 그 후에 만 ​​메소드가 메소드 뒤에 주어진 코드를 실행할 것이라고 생각했습니다. – Roman

+0

이 방법으로 생각해보십시오.이 메서드의 작업은 실제로 서비스를 해결하는 것이 아니라 나중에 서비스를 해결할 수있는 스레드를 시작하는 것입니다. 그래서 네 프로그램은 메서드가 작업을 끝내기를 기다려야하지만 서비스가 해결 될 때까지 기다릴 필요가 없다. – Wyzard

0

JBonjourBrowser에서 JTree 가입자 모델에서 다른 사람이 인용 한 "비동기 방식"이 어떻게 사용되는지 확인할 수 있습니다. 이 "장치가 종종 매우 과도하고 서비스를 발표하고 그후 사라 곳 ... 특히 유용 것을 저자의 노트.

0

콜백 인터페이스 스타일은 일반적으로 비동기 작업에 사용됩니다.

가 인터페이스를 설계 할 때 특히 네트워크 또는 IO 작업과 관련된 서비스는 두 가지 질문이 자주 올 : 1. 동작 동기 (차단) 또는 비동기 (비 차단) 2. 작업이 값 여부를

을 반환하지 않습니다 우리는 할 수 없습니다 콜백 스타일이 Object Oriented인지 아닌지 말하십시오. Object orie 네이티브 디자인은 각 객체에 대한 명확한 책임을 할당하는 것입니다.

반대로 콜백 메커니즘은 비동기 작업을위한 OO 디자인의 매우 일반적인 패턴입니다. 1. 제공된 서비스를 제공하는 서비스 2. 서비스의 응답 수신에 대한 콜백