Служба NSDs не является незарегистрированной должным образом
Немного предыстории вопроса. Я делаю многопользовательскую игру, которая использует обнаружение сетевых сервисов для трансляции сервисов. Хотя я не новичок ни в Java, ни в Android, я новичок в технологиях, которые используют Wi-Fi для подключения устройств. Итак, в моем приложении есть действие, когда пользователь предлагает войти в комнату или создать ее. Когда пользователь нажимает "Создать комнату", я сначала проверяю, есть ли уже зарегистрированный сервис. Если он существует, я отменяю его регистрацию и регистрирую новый, а также записываю результат этих действий в журнал отладки. Вот код метода, который вызывается внутри метода onClick() кнопки "Создать комнату":
public void registerService(){
if(mConnection.getLocalPort() > -1) {
mNsdHelper.tearDown();
mNsdHelper.registerService(mConnection.getLocalPort());
mNsdHelper.discoverServices();
Log.d(Keys.MAFIA_TAG, "Service Registered from registerService()");
} else {
Log.d(Keys.MAFIA_TAG, "ServerSocket isn't bound.");
}
}
код метода tearDown ():
public void tearDown() {
if (mRegistrationListener != null) {
try {
mNsdManager.unregisterService(mRegistrationListener);
} finally {
}
mRegistrationListener = null;
}
}
Проблема в том, что, как я вижу из журналов, сервис успешно незарегистрирован, и сразу после этого система сообщает мне, что обнаружен тот же сервис, так что теперь у меня есть два сервиса: вновь созданный и старый. Вот журналы:
Пользователь нажимает "Создать комнату":
05-06 20:30:10.362 3685-3685/com.example.yarkov.mafiamultiplayer D/mafia main﹕ DeviceSony //the name of the service
05-06 20:30:10.363 3685-3685/com.example.yarkov.mafiamultiplayer D/NsdHelper﹕ Service registration started
05-06 20:30:10.366 3685-3685/com.example.yarkov.mafiamultiplayer D/mafia main﹕ Service Registered from registerService()
05-06 20:30:10.378 3685-4701/com.example.yarkov.mafiamultiplayer D/NsdHelper﹕ Service discovery started
05-06 20:30:10.433 3685-3685/com.example.yarkov.mafiamultiplayer I/Timeline﹕ Timeline: Activity_idle id: android.os.BinderProxy@2bdc45ef time:32538709
05-06 20:30:11.180 3685-4701/com.example.yarkov.mafiamultiplayer D/NsdHelper﹕ Service registered: DeviceSony
05-06 20:30:11.431 3685-4701/com.example.yarkov.mafiamultiplayer D/NsdHelper﹕ Same machine: DeviceSony //a service has been found, but it's a local one
Пользователь нажимает кнопку Назад:
05-06 20:30:35.440 3685-4701/com.example.yarkov.mafiamultiplayer D/NsdHelper﹕ Service unregistered: DeviceSony
05-06 20:30:35.563 3685-3685/com.example.yarkov.mafiamultiplayer I/Timeline﹕ Timeline: Activity_idle id: android.os.BinderProxy@35979eff time:32563839
05-06 20:30:36.649 3685-4701/com.example.yarkov.mafiamultiplayer E/NsdHelper﹕ service lostname: DeviceSony, type: _http._tcp., host: null, port: 0
Пользователь снова нажимает "Создать комнату":
05-06 20:31:16.867 3685-3685/com.example.yarkov.mafiamultiplayer I/Timeline﹕ Timeline: Activity_launch_request id:com.example.yarkov.mafiamultiplayer time:32605143
05-06 20:31:16.935 3685-3685/com.example.yarkov.mafiamultiplayer D/mafia main﹕ DeviceSony
05-06 20:31:16.935 3685-3685/com.example.yarkov.mafiamultiplayer D/NsdHelper﹕ Service registration started
05-06 20:31:16.935 3685-3685/com.example.yarkov.mafiamultiplayer D/mafia main﹕ Service Registered from registerService()
05-06 20:31:16.940 3685-5996/com.example.yarkov.mafiamultiplayer D/NsdHelper﹕ Service discovery started
05-06 20:31:17.016 3685-3722/com.example.yarkov.mafiamultiplayer D/OpenGLRenderer﹕ endAllStagingAnimators on 0xb83c6600 (RippleDrawable) with handle 0xb83ae018
05-06 20:31:17.028 3685-3685/com.example.yarkov.mafiamultiplayer I/Timeline﹕ Timeline: Activity_idle id: android.os.BinderProxy@4d088df time:32605304
05-06 20:31:17.624 3685-5996/com.example.yarkov.mafiamultiplayer D/NsdHelper﹕ Service registered: DeviceSony
05-06 20:31:17.872 3685-5996/com.example.yarkov.mafiamultiplayer D/NsdHelper﹕ Same machine: DeviceSony
05-06 20:31:17.875 3685-4701/com.example.yarkov.mafiamultiplayer D/NsdHelper﹕ Same machine: DeviceSony
Мы видим, что было найдено 2 службы вместо одной, что означает, что первая служба не была незарегистрированной должным образом.
Спасибо всем заранее!
1 ответ
Ответ так же прост, как мне надоело это соединение Wi-Fi: вам просто нужно вызвать NsdManager.stopServiceDiscovery() в (в моем случае) метод tearDown().
Но здесь возникает другой вопрос: я заметил, что когда система обнаруживает локальную службу, ее порт равен 0, а localport чем-то напоминает 3456. Почему?