2015-05-06 9 views
0

Немного фона вопроса. Я делаю многопользовательскую игру, которая использует обнаружение сетевых сервисов для трансляции службы. Хотя я не ничья в Java, ни в андроиде, я являюсь нищим в технологиях, которые используют 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; 
     } 
    } 

Проблема: как я могу см. в журналах, служба становится незарегистрированной, и сразу после нее система сообщает мне, что тот же сервис обнаружен, так что теперь у меня есть две службы: вновь созданная и старая. Вот журналы:

Пользователь нажимает "Create Room":

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: [email protected] 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: [email protected] 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 

Пользователь нажимает "Create Room" снова:

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: [email protected] 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 службы, что означает, что первые rvice не был незарегистрирован должным образом.

Спасибо вам заранее!

ответ

0

Ответ так же прост, как мне надоело это соединение wi-fi: вам просто нужно вызвать NsdManager.stopServiceDiscovery() в (в моем случае) методе tearDown().

Но здесь возникает еще один вопрос: я заметил, что, когда система обнаруживает локальную услугу, ее порт равен 0, когда локальный порт несколько похож на 3456. Почему?

Смежные вопросы