11

Tôi đang cố gắng bật tính năng khám phá dịch vụ trong ứng dụng máy khách-khách của mình bằng cách sử dụng JmDNS. Tôi hoàn toàn hiểu đăng ký dịch vụ trên phía máy chủ, với mã giống như thế này:Phát hiện dịch vụ JmDNS trong máy khách-máy chủ

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

Tuy nhiên, tôi đang gặp khó khăn để tìm hiểu làm thế nào để có khách hàng của tôi lấy số cổng và địa chỉ IP từ dịch vụ đã đăng ký và sử dụng dữ liệu này để mở kết nối TCP. Tôi đã tìm kiếm các ví dụ về cách sử dụng JmDNS nhưng không có kết quả. Bất cứ ai ở đây có thể cho tôi một số ví dụ cơ bản không? Hoặc nếu bất cứ ai có bất kỳ liên kết đến các nguồn lực/hướng dẫn tốt trên JmDNS họ có thể vui lòng cung cấp cho họ?

Lưu ý: JmDNS là một sự cần thiết ở đây, vì vậy tôi sẽ đánh giá cao các câu trả lời chỉ liên quan đến JmDNS và không cung cấp giải pháp thay thế. Ngoài ra, tôi đã xem xét API JmDNS rộng rãi, và vẫn không thể tìm ra được, vì vậy vui lòng không đăng liên kết tới tài liệu dưới dạng tài nguyên.

Cảm ơn.

Trả lời

20

Server side:

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

Khách hàng bên:

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(); 

Một khi bạn có URL http://192.168.11.2:6666/myTestService, bạn có thể phân tích/sử dụng nó kết nối ổ cắm mở. Hy vọng rằng giúp đỡ.

+0

Cảm ơn, điều này thực sự làm cho mọi thứ rõ ràng hơn rất nhiều đối với tôi. Hoàn toàn không quen thuộc với các cuộc gọi lại trong Java (hoặc bằng bất kỳ ngôn ngữ nào, cho vấn đề đó) làm cách nào để tôi truy xuất thông tin dịch vụ từ cuộc gọi ngược lại với ServiceInfo []? Có phải nó chỉ là vấn đề tuyên bố chuỗi serviceUrl bên ngoài triển khai serviceListener để tôi có thể truy cập nó trên toàn cầu không? –

+0

Có, thường xác định ServiceListener như một lớp bên trong và định nghĩa serviceUrl như là một biến cá thể của lớp bên ngoài. – yorkw

+0

@yorkw Bất kỳ cơ hội nào bạn có thể mở rộng mẫu mã cũng hiển thị cách phân tích cú pháp và mở ổ cắm? Tôi không thể tìm thấy mã kết nối ổ cắm phía máy khách thích hợp. – Radu

Các vấn đề liên quan