Служба регистрации mDNS не всегда доступна для обнаружения в Windows

#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 секундами сна в отдельном потоке, и до сих пор он работал надежно.