问题的背景。我正在制作一个使用网络服务发现来广播服务的多人游戏。虽然我既不是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个服务,这意味着第一个服务未正确注销。
提前谢谢大家!
答案 0 :(得分:0)
答案很简单,因为我厌倦了这个wi-fi连接:你只需要在(在我的例子中)使用tearDown()方法调用NsdManager.stopServiceDiscovery()。
但是这里出现了另一个问题:我注意到,当系统发现本地服务时,它的端口是0,当localport有点像3456时。为什么?