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);
}
* ...
};