2012-02-14 13 views
6

Tôi đã có thể lấy các mẫu đi kèm với JmDNS để biên dịch và chạy, tuy nhiên tôi không thể nhận bất kỳ lớp nào để khám phá các dịch vụ của mình.Các mẫu có JmDNS

Tôi đang chạy một môi trường Windows với chạy VNC nhiều máy tính, SSH & Apache và tôi đã cố gắng để có được JmDNS để khám phá ít nhất một trong những ...

Những gì tôi tưởng muốn là được có thể phát hiện tất cả các máy chủ VNC đang chạy trên mạng của tôi. Có một số loại khách hàng và máy chủ ghép nối mà tôi chỉ có thể khám phá ra một dịch vụ nếu tôi đã đăng ký nó bằng cách sử dụng JmDNS?

Bất kỳ trợ giúp nào nhận được một số kết quả từ các mẫu sẽ được đánh giá cao, tài liệu đó không giúp được gì nhiều.

import java.io.IOException; 
import java.util.logging.ConsoleHandler; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

import javax.jmdns.JmDNS; 
import javax.jmdns.ServiceEvent; 
import javax.jmdns.ServiceListener; 

/** 
* Sample Code for Service Discovery using JmDNS and a ServiceListener. 
* <p> 
* Run the main method of this class. It listens for HTTP services and lists all changes on System.out. 
* 
* @author Werner Randelshofer 
*/ 
public class DiscoverServices { 

    static class SampleListener implements ServiceListener { 
     @Override 
     public void serviceAdded(ServiceEvent event) { 
      System.out.println("Service added : " + event.getName() + "." + event.getType()); 
     } 

     @Override 
     public void serviceRemoved(ServiceEvent event) { 
      System.out.println("Service removed : " + event.getName() + "." + event.getType()); 
     } 

     @Override 
     public void serviceResolved(ServiceEvent event) { 
      System.out.println("Service resolved: " + event.getInfo()); 
     } 
    } 

    /** 
    * @param args 
    *   the command line arguments 
    */ 
    public static void main(String[] args) { 
     try { 

      // Activate these lines to see log messages of JmDNS 
      boolean log = false; 
      if (log) { 
       Logger logger = Logger.getLogger(JmDNS.class.getName()); 
       ConsoleHandler handler = new ConsoleHandler(); 
       logger.addHandler(handler); 
       logger.setLevel(Level.FINER); 
       handler.setLevel(Level.FINER); 
      } 

      final JmDNS jmdns = JmDNS.create(); 
      String type = "_http._tcp.local."; 
      if(args.length > 0) { 
       type = args[0]; 
      } 
      jmdns.addServiceListener(type, new SampleListener()); 

      System.out.println("Press q and Enter, to quit"); 
      int b; 
      while ((b = System.in.read()) != -1 && (char) b != 'q') { 
       /* Stub */ 
      } 
      jmdns.close(); 
      System.out.println("Done"); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

Riêng JmDNS không hoạt động nói chung, bạn nên thực sự thực hiện trên tất cả các card mạng bằng NetworkTopologyListener. JmmDNS nên làm điều đó cho bạn nhưng không làm việc cho tôi. –

+0

@ErikMartino -can bạn có thể đưa ra ví dụ về NetworkTopologyListener đã làm lo lắng không? –

Trả lời

5

Để khám phá ra một loại hình cụ thể của dịch vụ, bạn cần phải biết tên loại dịch vụ đúng, hãy kiểm tra DNS SRV (RFC 2782) Service Types:

String bonjourServiceType = "_http._tcp.local."; 
bonjourService = JmDNS.create(); 
bonjourService.addServiceListener(bonjourServiceType, bonjourServiceListener); 
ServiceInfo[] serviceInfos = bonjourService.list(bonjourServiceType); 
for (ServiceInfo info : serviceInfos) { 
    System.out.println("## resolve service " + info.getName() + " : " + info.getURL()); 
} 
bonjourService.close(); 

Đối với VNC, sử dụng _rfb._tcp.local.
Đối với SSH, hãy sử dụng _ssh._tcp.local.
Đối với Apache, hãy sử dụng _http._tcp.local.

+0

Cảm ơn nhưng mã của tôi có vẻ chính xác, tôi có thể vnc vào mac tôi thiết lập, nhưng tôi vẫn không thể có được máy chủ để liệt kê ngay cả với mã bạn cung cấp (mà là tương tự như mã của riêng tôi). Tôi đã chỉnh sửa bài đăng ở trên để thêm mã thử nghiệm của mình. Bạn có thể thử điều này trên mạng của mình và xác minh xem nó có hoạt động không? Có lẽ có gì đó không ổn trong thiết lập của tôi ở đâu đó. – Ali

+1

Nếu nó là một máy mac, bạn có thể bonjour dịch vụ VNC (Apple Remote Desktop) bằng cách sử dụng loại dịch vụ = "_net-assistant._udp." – yorkw

+0

Tôi đã có một số may mắn nhận được mã để phát hiện các dịch vụ trên máy cục bộ của tôi chứ không phải các dịch vụ trên mạng cục bộ. Khi tôi thực hiện các jar jmdns, một hộp thoại xuất hiện mà không có vấn đề phát hiện máy trên mạng của tôi. Vì vậy, hiện tại kế hoạch là bước qua nguồn cho hộp thoại đó và hy vọng tìm ra những gì đang xảy ra. – Ali