#java #python #windows #zeroconf #jmdns
Вопрос:
Я пытаюсь установить беспроводную связь между клиентскими устройствами Android и сервером Windows. Сервер, который я использую, — это программа на python, которая регистрирует службу mDNS с помощью Python zeroconf. Кажется, все работает нормально, но я заметил, что через короткий промежуток времени ( обычно около минуты) мой сервис больше не будет доступен. Я попробовал пример кода, предоставленный в github модуля, чтобы уменьшить количество ошибок, но столкнулся с той же проблемой :
import argparse
import logging
import socket
from time import sleep
from zeroconf import IPVersion, ServiceInfo, Zeroconf
if __name__ == '__main__':
logging.basicConfig(level=logging.DEBUG)
parser = argparse.ArgumentParser()
parser.add_argument('--debug', action='store_true')
version_group = parser.add_mutually_exclusive_group()
version_group.add_argument('--v6', action='store_true')
version_group.add_argument('--v6-only', action='store_true')
args = parser.parse_args()
if args.debug:
logging.getLogger('zeroconf').setLevel(logging.DEBUG)
if args.v6:
ip_version = IPVersion.All
elif args.v6_only:
ip_version = IPVersion.V6Only
else:
ip_version = IPVersion.V4Only
desc = {'path': '/~paulsm/'}
info = ServiceInfo(
"_http._tcp.local.",
"Paul's Test Web Site._http._tcp.local.",
addresses=[socket.inet_aton("127.0.0.1")],
port=80,
properties=desc,
server="ash-2.local.",
)
zeroconf = Zeroconf(ip_version=ip_version)
print("Registration of a service, press Ctrl-C to exit...")
zeroconf.register_service(info)
try:
while True:
sleep(0.1)
except KeyboardInterrupt:
pass
finally:
print("Unregistering...")
zeroconf.unregister_service(info)
zeroconf.close()
Кроме того, я попытался запрограммировать другую службу, но на этот раз на Java с использованием JmDNS, но у меня была та же самая проблема, служба была обнаружена в течение короткого периода времени, прежде чем исчезнуть навсегда.
Основной класс :
public class MainClass {
public static void main(String[] args) {
NSDService nsdService = new NSDService();
nsdService.regService();
}
Класс обнаружения сетевых служб :
import javax.jmdns.JmDNS;
import javax.jmdns.ServiceInfo;
import java.io.IOException;
import java.net.InetAddress;
public class NSDService {
public void regService(){
try {
// Create a JmDNS instance
JmDNS jmdns = JmDNS.create(InetAddress.getLocalHost());
System.out.println(" Registering service");
// Register a service
ServiceInfo serviceInfo = ServiceInfo.create("_http._tcp.local.", "JAVA TEST", 42069, "path=index.html");
jmdns.registerService(serviceInfo);
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
This issue had led me to believe that it’s either a firewall problem ( i do not think so, i disabled the firewall and anti virus while testing ), or an issue on Windows.
Testing the exact same python code on Linux did not raise such issues, and the server has been running for over 2 houres prior to me writing this.
Есть ли какой-то способ исправить эту проблему, предпочтительно с помощью Python, я не возражаю против использования вызовов API для Windows, но, к сожалению, я не могу использовать среду Linux.
РЕДАКТИРОВАТЬ : я нашел обходной путь, используя метод zeroconf.update_service (), и я использую его в бесконечном цикле с 30 секундами сна в отдельном потоке, и до сих пор он работал надежно.