Вот простое серверное приложение , использующее Bonjour и написанное на Java . Основная часть кода приведена здесь:
public class ServiceAnnouncer implements IServiceAnnouncer, RegisterListener {
private DNSSDRegistration serviceRecord;
private boolean registered;
public boolean isRegistered(){
return registered;
}
public void registerService() {
try {
serviceRecord = DNSSD.register(0,0,null,"_killerapp._tcp", null,null,1234,null,this);
} catch (DNSSDException e) {
// error handling here
}
}
public void unregisterService(){
serviceRecord.stop();
registered = false;
}
public void serviceRegistered(DNSSDRegistration registration, int flags,String serviceName, String regType, String domain){
registered = true;
}
public void operationFailed(DNSSDService registration, int error){
// do error handling here if you want to.
}
}
Я понимаю это следующим образом. Мы можем попытаться зарегистрировать сервис, вызывающий метод «registerService», который, в свою очередь, вызывает метод «DNSSD.register». «DNSSD.register» пытается зарегистрировать сервис и, в общем случае, может привести к двум результатам: сервис «успешно зарегистрирован» и «регистрация не пройдена». В обоих случаях «DNSSD.register» вызывает соответствующий метод («serviceRegistered» или «operationFailed») объекта, который был передан DNSSD.register в качестве последнего аргумента. И программист решает, что поместить в «serviceRegistered» и «operationFailed». Это понятно.
Но стоит ли мне пытаться зарегистрировать сервис из "OperationFailed"? Я боюсь, что таким образом мое приложение будет пытаться зарегистрировать сервис слишком часто. Должен ли я положить «сон» или «пауза» в «операция отказала»? Но в любом случае, мне кажется, что, когда приложение не может зарегистрировать службу, оно также не может делать что-то еще (например, заботиться о GUI). Или может DNSSD.register ввести какой-то параллелизм? Я имею в виду, что он запускает новый поток, но если я попытаюсь зарегистрировать службу из «Неудачной операции», я могу создать огромное количество потоков. Это может случиться? Если это так, то должно ли это быть проблемой? И если это так, как я могу решить эту проблему?