0

質問の背景のビット。ネットワーク サービス ディスカバリを使用してサービスをブロードキャストするマルチプレイヤー ゲームを作成しています。私は Java や Android の初心者ではありませんが、Wi-Fi を使用してデバイスを接続する技術の初心者です。したがって、私のアプリでは、ユーザーが部屋に入るか、部屋を作成することを申し出たアクティビティがあります。ユーザーが「ルームを作成」をクリックすると、まず登録済みのサービスがあるかどうかを確認します。存在する場合は、登録を解除して新しいものを登録し、これらのアクションの結果をデバッグ ログに書き込みます。以下は、「Create Room」ボタンの 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;
        }
    }

問題は、ログからわかるように、サービスが正常に登録解除され、システムが同じサービスが検出されたことを通知した直後に、新しく作成されたサービスと古いサービスの 2 つのサービスがあることです。ログは次のとおりです。

ユーザーが「ルームの作成」を押します:

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

1 つではなく 2 つのサービスが見つかったことがわかります。これは、最初のサービスが適切に登録解除されなかったことを意味します。

よろしくお願いします!

4

1 に答える 1

0

答えは、私がこの wi-fi 接続にうんざりしているのと同じくらい簡単です。(私の場合) TearDown() メソッドで NsdManager.stopServiceDiscovery() を呼び出すだけです。

しかし、ここで別の質問が表示されます。システムがローカル サービスを検出すると、ローカル ポートが 3456 に似ているのに、ポートが 0 であることに気付きました。

于 2015-05-06T20:16:31.243 に答える