11

JmDNS kullanarak istemci-sunucu uygulamasında hizmet keşfini etkinleştirmeye çalışıyorum.İstemci-sunucuda JmDNS hizmet keşfi

JmDNS jmdns = JmDNS.create(localhost); 
jmdns.register(serviceInfo); 

Ancak, müvekkilimin tescilli hizmet ve kullanımından port numarasını ve IP adresini almasını sağlamak nasıl sergiyi sorun yaşıyorum: Tam olarak bu benzediğini koduyla, sunucu tarafında hizmet kayıt anlamak Bu veri bir TCP bağlantısı açmak için. JmDNS'nin nasıl kullanılacağına dair örnekler aradım ama boşuna. Buradaki herkes bana bazı temel örnekler verebilir mi? Ya da herhangi biri JmDNS ile ilgili iyi kaynaklara/eğiticilere sahipse bunları sağlayabilir mi?

Not: JmDNS burada bir gereksinimdir, bu yüzden sadece JmDNS ile ilgili cevapları takdir edip bir alternatif sunmamaya değer. Ayrıca, JmDNS API'sine kapsamlı bir şekilde baktım ve yine de bunu çözemiyorum, bu yüzden lütfen dokümanlar için bir kaynak olarak bir bağlantı göndermeyin.

Teşekkürler.

cevap

20

Sunucu tarafı:

mdnsServer = JmDNS.create(localhost); 
// Register a test service. 
ServiceInfo testService = ServiceInfo.create("my-service-type", "Test Service", 6666, "test service"); 
mdnsServer.registerService(testService); 

İstemci tarafı: URL'yi http://192.168.11.2:6666/myTestService sahip olduktan sonra

private ServiceListener mdnsServiceListener = new ServiceListener() { 
    public void serviceAdded(ServiceEvent serviceEvent) { 
    // Test service is discovered. requestServiceInfo() will trigger serviceResolved() callback. 
    mdnsService.requestServiceInfo(Constants.mdnsServiceType, serviceEvent.getName()); 
    } 

    public void serviceRemoved(ServiceEvent serviceEvent) { 
    // Test service is disappeared. 
    } 

    public void serviceResolved(ServiceEvent serviceEvent) { 
    // Test service info is resolved. 
    String serviceUrl = serviceEvent.getInfo().getURL(); 
    // serviceURL is usually something like http://192.168.11.2:6666/my-service-name 
}; 

mdnsService = JmDNS.create(); 
mdnsService.addServiceListener("my-service-type", mdnsServiceListener); 
ServiceInfo[] infos = mdnsService.list(Constants.mdnsServiceType); 

// Retrieve service info from either ServiceInfo[] returned here or listener callback method above. 
mdnsService.removeServiceListener("my-service-type", mdnsServiceListener); 
mdnsService.close(); 

, sen/ayrıştırmak bunu açık soket bağlantısını kullanabilirsiniz. Umarım yardım et.

+0

Teşekkürler, bu gerçekten benim için işleri daha net hale getiriyor. Java'daki (veya herhangi bir dilde) geri aramaları tamamen bilmediğinizden, ServiceInfo [] 'nın tersine servis bilgisini geri aramadan nasıl geri alabilirim? ServiceListener uygulamasının dışındaki serviceUrl dizesini bildirme meselesi, bu yüzden global olarak erişebiliyor muyum? –

+0

Evet, genellikle ServiceListener'ı bir iç sınıf olarak tanımlar ve serviceUrl öğesini dış sınıfın örnek değişkeni olarak tanımlar. – yorkw

+0

@yorkw Kod örneğini, nasıl ayrıştırılacağını ve soket açıldığını gösterecek şekilde genişletme şansınız var mı? Uygun istemci tarafında soket bağlantı kodunu bulamıyorum. – Radu