Descoperirea Serviciilor Accesibile
Operațiile de pornire / oprire a descoperirii serviciilor disponibile trebuie să aibă în vedere resursele afectate precum și impactul asupra altor funcționalități cum ar fi viteza de transfer prin rețea, respectiv autonomia.
De regulă, pornirea operației de descoperire a serviciilor disponibile
este realizată pe metoda onResume()
, adică din momentul în care
activitatea este vizibilă.
Similar, oprirea operației de descoperire a serviciilor disponibile este
realizată pe metoda onPause()
, adică din momentul în care activitatea
nu este vizibilă.
Totodată, este recomandat să se pună la dispoziția utilizatorilor elemente în cadrul interfeței grafice prin intermediul cărora aceste operații să poată fi controlate prin interacțiunea cu cei care folosesc aplicația Android.
JmDNS
**Pornirea ** operației de descoperire a serviciilor disponibile se
face prin intermediul metodei addServiceListener(String,
ServiceListener)
din clasa JmDNS
care primește ca parametri:
- tipul de serviciu;
- un obiect ascultător de tipul
ServiceListener
, care reacționează la evenimentele legate de serviciile găsite / pierdute.
Oprirea operației de descoperire a serviciilor disponibile se face
prin intermediul metodei removeServiceListener(String,
ServiceListener)
din clasa JmDNS
care primește ca parametru un obiect ascultător de
tipul ServiceListener
, care reacționează la evenimentele legate de
serviciile găsite / pierdute.
Ca atare, informațiile cu privire la găsirea / pierderea serviciilor în
rețeaua locală vor fi furnizate numai între apelurile metodelor
addServiceListener()
, respectiv removeServiceListener()
.
public void startNetworkServiceDiscovery() {
if (jmDns != null && serviceListener != null) {
jmDns.addServiceListener(Constants.SERVICE_TYPE, serviceListener);
}
}
public void stopNetworkServiceDiscovery() {
if (jmDns != null && serviceListener != null) {
jmDns.removeServiceListener(Constants.SERVICE_TYPE, serviceListener);
}
* ...
}
Pentru obiectul de tip ServiceListener
trebuie implementate metodele
apelate în mod automat în momentul în care un serviciu este găsit,
respectiv este pierdut:
-
serviceAdded(ServiceEvent) - se verifică parametrii serviciului descoperit (tip și denumire), putându-se întâlni următoarele situații:
- tip de serviciu necunoscut (cu toate că descoperirea implică filtrarea după un tip de servicii specific);
- descoperirea serviciului oferit de mașina curentă / dispozitivul curent - se realizează comparația dintre denumirea serviciului găsit și denumirea serviciului curent;
- descoperirea unui serviciu oferit de o altă mașină / un alt
dispozitiv (se poate folosi un șablon pe denumirea
serviciului) - se trece la rezolvarea serviciului respectiv
(prin invocarea metodei
requestServiceInfo(String, String)
din cadrul obiectului de tipJmDNS
.
-
serviceRemoved(ServiceEvent) - se gestionează corespunzător lista de servicii descoperite.
Un obiect de tipul ServiceInfo conține, printre altele, și informații cu privire la:
- getInetAddresses() - adresele la care poate fi accesat serviciul;
- getPort() - portul pe care poate fi accesat serviciul.
ServiceListener serviceListener = new ServiceListener() {
* ...
@Override
public void serviceAdded(ServiceEvent serviceEvent) {
if (!serviceEvent.getType().equals(Constants.SERVICE_TYPE)) {
Log.i(Constants.TAG, "Unknown Service Type: " + serviceEvent.getType());
} else if (serviceEvent.getName().equals(serviceName)) {
Log.i(Constants.TAG, "The service running on the same machine has been discovered: " + serviceName);
} else 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());
}
}
@Override
public void serviceRemoved(final ServiceEvent serviceEvent) {
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) {
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, -1);
if (discoveredServices.contains(networkService)) {
int index = discoveredServices.indexOf(networkService);
discoveredServices.remove(index);
chatActivity.setDiscoveredServices(discoveredServices);
}
}
};
Note
Alternativ, rezolvarea serviciului descoperit poate fi
realizată ad-hoc (fără a se apela metoda serviceResolved()
), prin
apelul metodei getServiceInfo(String,
String),
cu precizarea că timpul său de execuție poate fi considerabil:
ServiceInfo serviceInfo = serviceEvent.getDNS().getServiceInfo(
serviceEvent.getType(),
serviceEvent.getName()
);