Android NSD: registerService возвращает порт 0 и нулевой хост - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь подключить два устройства Android через API обнаружения сетевых служб (NSD) в сети. Я следил за официальной страницей Android во время реализации. Одно из устройств действует как сервер, а другое - как клиент. Я прошу сеть для следующего свободного порта. Но как только я регистрирую Сервер в сети через registerService (nsdsInfo, NsdManager.PROTOCOL_DNS_SD, mRegistrationListener), параметры в nsdsInfo становятся пустыми. Поэтому перед вызовом этой строки кода объект nsdsInfo содержит правильный порт, правильный хост и т. Д. После вызова этого метода метод Callback в слушателе onServiceRegistered () содержит Port = 0 и Host = null.

Есть ли предположения, почему порт и имя хоста теряются во время процесса регистрации, но регистрация все же прошла успешно? С другой стороны, другое устройство не может обнаружить сервер, даже если сработал обратный вызов регистрации «onServiceRegistrered ()».

Заранее спасибо, ребята!

//Const
    private static final String SERVICE_TYPE = "_speech._tcp";
    private static final String SERVICE_NAME = "speech";

    public WiFiServiceRegistry(Context ctx) throws IOException {

        this.context = ctx;

        initializeSocketAndPort();
        initializeNsdService();
        initializeRegistrationListener();

        if (nsdManager == null)
            nsdManager = (NsdManager) context.getSystemService(Context.NSD_SERVICE);
        System.out.println("nsdsinfo host" + nsdsInfo.getServiceName());
        System.out.println("nsdsinfo port" + nsdsInfo.getPort());
        nsdManager.registerService(nsdsInfo, NsdManager.PROTOCOL_DNS_SD, mRegistrationListener);
    }

    /**
     * Initializes the NsdServiceInfo.
     */
    private void initializeNsdService(){
        nsdsInfo = new NsdServiceInfo();
        nsdsInfo.setServiceName(SERVICE_NAME);
        nsdsInfo.setServiceType(SERVICE_TYPE);
        nsdsInfo.setPort(mLocalPort);
    }

    /**
     * Initializes the socket and port. Parameter 0 means that the next available port is used (dynamic).
     * @throws IOException
     */
    private void initializeSocketAndPort() throws IOException {
        mServerSocket = new ServerSocket(0);
        mLocalPort = mServerSocket.getLocalPort();
    }

    /**
     * Inizializes the registrationListener. Keeps track of the registration status.
     */
    private void initializeRegistrationListener(){
        mRegistrationListener = new NsdManager.RegistrationListener() {
            @Override
            public void onRegistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
                System.out.println("WiFiServiceRegistry: Registration failed");
            }

            @Override
            public void onUnregistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
                System.out.println("WiFiServiceRegistry: Unregistration failed");
            }

            @Override
            public void onServiceRegistered(NsdServiceInfo serviceInfo) {
                System.out.println("WiFiServiceRegistry: Registered service");
                System.out.println("WiFiServiceRegistry: Port " + serviceInfo.getPort());
                System.out.println("WiFiServiceRegistry: Host " + serviceInfo.getHost());
                System.out.println("WiFiServiceRegistry: ServiceName " + serviceInfo.getServiceName());
            }

            @Override
            public void onServiceUnregistered(NsdServiceInfo serviceInfo) {
                System.out.println("WiFiServiceRegistry: Unregistered service");
            }
        };
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...