Rezolvarea Serviciilor Descoperite Anterior

Rezolvarea unui serviciu descoperit anterior implică obținerea de informații suplimentare cu privire la acesta.

Astfel, pentru un serviciu pentru care se cunoaște doar tipul și denumirea, se poate determina, prin intermediul multi-cast DNS, adresa și portul la care acesta este disponibil, putând fi accesat.

JmDNS

În cadrul metodei serviceAdded() din ascultătorul de tip ServiceListener, în situația în care denumirea serviciului corespunde unui anumit șablon (deși o astfel de condiție nu este întotdeauna necesară), se invocă metoda requestServiceInfo(String, String) care primește ca parametri:

  • tipul serviciului;
  • denumirea serviciului.
Service serviceListener = new ServiceListener() {
  * ...
  
  @Override
  public void serviceAdded(ServiceEvent serviceEvent) {
  
    * ...
    if (serviceEvent.getName().contains(Constants.SERVICE_NAME_SEARCH_KEY)) {
      Log.i(Constants.TAG, "The service should be resolved now: " + serviceEvent);
      jmDns.requestServiceInfo(serviceEvent.getType(), serviceEvent.getName());
    }               
  }
};

În situația în care operația de rezolvare a serviciului a fost realizată cu succes, se apelează metoda serviceResolved(ServiceEvent) în cadrul aceluiași obiect ascultător (de tip ServiceListener). Aceasta primește ca parametru un obiect ServiceEvent care încapsulează informații cu privire la serviciul rezolvat, sub forma unui obiect de tip ServiceInfo. Și în această situație se va gestiona corespunzător lista de servicii descoperite în rețeaua locală, obținându-se și un canal de comunicație către parametrii determinați.

ServiceListener serviceListener = new ServiceListener() {
  @Override
  public void serviceResolved(ServiceEvent serviceEvent) {
    if (serviceEvent.getName().equals(serviceName)) {
      Log.i(Constants.TAG, "The service running on the same machine has been discovered.");
      return;
    }
    
    ServiceInfo serviceInfo = serviceEvent.getInfo();
    if (serviceInfo == null) {
      Log.e(Constants.TAG, "Service Info for Service is null!");
      return;
    }
    
    String[] hosts = serviceInfo.getHostAddresses();
    String host = null;
    if (hosts.length == 0) {
      Log.e(Constants.TAG, "No host addresses returned for the service!");
      return;
    }
    host = hosts[0];
    if(host.startsWith("/")) {
      host = host.substring(1);
    }
    
    int port = serviceInfo.getPort();
    
    ArrayList<NetworkService> discoveredServices = chatActivity.getDiscoveredServices();
    NetworkService networkService = new NetworkService(serviceEvent.getName(), host, port, Constants.CONVERSATION_TO_SERVER);
    if (!discoveredServices.contains(networkService)) {
      discoveredServices.add(networkService);
      communicationToServers.add(new ChatClient(null, host, port));
      chatActivity.setDiscoveredServices(discoveredServices);
    }
    
    Log.i(Constants.TAG, "A service has been discovered on " + host + ":" + port);              
  }
  
  * ...
};