2016-08-22 13 views
2

最近Androidで提供されているNetwork Service Discoveryの作業を開始しました。登録した後にNsdManagerサービスが見つかりませんでした

同じネットワーク上に2つのアプリケーションを接続しました。一つは、このクラスでサービスを登録します:

public class NsdRegister { 

private Context        mContext; 

private NsdManager       mNsdManager; 
private NsdManager.RegistrationListener  mRegistrationListener; 

public String        mServiceName = "NsdServer1"; 
public static final String     SERVICE_TYPE = "_http._tcp."; 

public NsdHelper(Context context) { 
    mContext = context; 
    mNsdManager = (NsdManager) context.getSystemService(Context.NSD_SERVICE); 
} 


public void initializeRegistrationListener() { 
    mRegistrationListener = new NsdManager.RegistrationListener() { 

     @Override 
     public void onServiceRegistered(NsdServiceInfo NsdServiceInfo) { 
      mServiceName = NsdServiceInfo.getServiceName(); 
      System.out.println(mServiceName); 
     } 

     @Override 
     public void onRegistrationFailed(NsdServiceInfo arg0, int arg1) { 
      System.out.println(arg0.toString()); 
      System.out.println("Failed " + arg1); 
     } 

     @Override 
     public void onServiceUnregistered(NsdServiceInfo arg0) { 
     } 

     @Override 
     public void onUnregistrationFailed(NsdServiceInfo serviceInfo, int errorCode) { 
     } 
    }; 
} 

public void registerService() { 
    initializeRegistrationListener(); 
    NsdServiceInfo serviceInfo = new NsdServiceInfo(); 
    serviceInfo.setPort(5906); 
    serviceInfo.setServiceName(mServiceName); 
    serviceInfo.setServiceType(SERVICE_TYPE); 
    mNsdManager.registerService(serviceInfo, NsdManager.PROTOCOL_DNS_SD, mRegistrationListener); 
} 

public void tearDown() { 
    mNsdManager.unregisterService(mRegistrationListener); 
} 
} 

を他のアプリケーションがこのクラスを使用してネットワーク上のすべてのサービスを発見するでしょう:

public class NsdHelper { 

public static final String     SERVICE_TYPE = "_http._tcp."; 
public static final String     TAG = "NsdHelper"; 
public static final String     SERVER_AIO = "NsdServer1"; 

private Context        mContext; 

private NsdManager       mNsdManager; 
private NsdManager.DiscoveryListener  mDiscoveryListener; 

private NsdServiceInfo      mService; 

public NsdHelper(Context context) { 
    mContext = context; 
    mNsdManager = (NsdManager) context.getSystemService(Context.NSD_SERVICE); 
} 

private void initializeDiscoveryListener() { 
    mDiscoveryListener = new NsdManager.DiscoveryListener() { 

     @Override 
     public void onDiscoveryStarted(String regType) { 
      Log.d(TAG, "Service discovery started"); 
     } 

     @Override 
     public void onServiceFound(NsdServiceInfo service) { 
      if (service.getServiceName().equals(SERVER_AIO)) { 
       mNsdManager.resolveService(service, new NsdManager.ResolveListener() { 
        @Override 
        public void onResolveFailed(NsdServiceInfo nsdServiceInfo, int i) { 
         System.out.println("Failed to resolve"); 
        } 

        @Override 
        public void onServiceResolved(NsdServiceInfo nsdServiceInfo) { 
         stopDiscovery(); 
         System.out.println(nsdServiceInfo.getHost().getHostAddress()); 
        } 
       }); 
      } 
     } 

     @Override 
     public void onServiceLost(NsdServiceInfo service) { 
      Log.e(TAG, "service lost" + service); 
      if (mService == service) { 
       mService = null; 
      } 
     } 

     @Override 
     public void onDiscoveryStopped(String serviceType) { 
      Log.i(TAG, "Discovery stopped: " + serviceType); 
     } 

     @Override 
     public void onStartDiscoveryFailed(String serviceType, int errorCode) { 
      Log.e(TAG, "Discovery failed: Error code:" + errorCode); 
      mNsdManager.stopServiceDiscovery(this); 
     } 

     @Override 
     public void onStopDiscoveryFailed(String serviceType, int errorCode) { 
      Log.e(TAG, "Discovery failed: Error code:" + errorCode); 
      mNsdManager.stopServiceDiscovery(this); 
     } 
    }; 
} 

public void discoverServices() { 
    initializeDiscoveryListener(); 
    mNsdManager.discoverServices(SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener); 
} 

public void stopDiscovery() { 
    mNsdManager.stopServiceDiscovery(mDiscoveryListener); 
} 
} 

レジスタは罰金行くが、発見は、私のサービスを見つけることができません。私は2つのアプリのために同じネットワークに接続されています。

どこが問題かわかりません。

、私を助けてください

これは私のために完全に働いた

答えて

0

ありがとうございます。

Cliente

public class ClientActivity extends Activity { 

private String SERVICE_NAME = "Client Device"; 
private String SERVICE_TYPE = "_http._tcp."; 

private InetAddress hostAddress; 
private int hostPort; 
private NsdManager mNsdManager; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // set content view and other stuff 

    // NSD Stuff 
    mNsdManager = (NsdManager) getSystemService(ClientActivity.NSD_SERVICE); 
    mNsdManager.discoverServices(SERVICE_TYPE, 
      NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener); 
} 

@Override 
protected void onPause() { 
    if (mNsdManager != null) { 
     mNsdManager.stopServiceDiscovery(mDiscoveryListener); 
    } 
    super.onPause(); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    if (mNsdManager != null) { 
     mNsdManager.discoverServices(
       SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener); 
    } 

} 

@Override 
protected void onDestroy() { 
    if (mNsdManager != null) { 
     mNsdManager.stopServiceDiscovery(mDiscoveryListener); 
    } 
    super.onDestroy(); 
} 


NsdManager.DiscoveryListener mDiscoveryListener = new NsdManager.DiscoveryListener() { 

    // Called as soon as service discovery begins. 
    @Override 
    public void onDiscoveryStarted(String regType) { 
     System.out.println("Listening Service discovery started"); 
    } 

    @Override 
    public void onServiceFound(NsdServiceInfo service) { 
     // A service was found! Do something with it. 
     System.out.println("Listening Service discovery success : " + service); 
     System.out.println("Listening Host = "+ service.getServiceName()); 
     System.out.println("Listening port = " + String.valueOf(service.getPort())); 

     if (!service.getServiceType().equals(SERVICE_TYPE)) { 
      // Service type is the string containing the protocol and 
      // transport layer for this service. 
      System.out.println("Listening Unknown Service Type: " + service.getServiceType()); 
     } else if (service.getServiceName().equals(SERVICE_NAME)) { 
      // The name of the service tells the user what they'd be 
      // connecting to. It could be "Bob's Chat App". 
      System.out.println("Listening Same machine: " + SERVICE_NAME); 
     } else { 
      System.out.println("Listening Diff Machine : " + service.getServiceName()); 
      // connect to the service and obtain serviceInfo 
      mNsdManager.resolveService(service, mResolveListener); 
     } 
    } 

    @Override 
    public void onServiceLost(NsdServiceInfo service) { 
     // When the network service is no longer available. 
     // Internal bookkeeping code goes here. 
     System.out.println("Listening service lost" + service); 
    } 

    @Override 
    public void onDiscoveryStopped(String serviceType) { 
     System.out.println("Listening Discovery stopped: " + serviceType); 
    } 

    @Override 
    public void onStartDiscoveryFailed(String serviceType, int errorCode) { 
     System.out.println("Listening failed: Error code:" + errorCode); 
     mNsdManager.stopServiceDiscovery(this); 
    } 

    @Override 
    public void onStopDiscoveryFailed(String serviceType, int errorCode) { 
     System.out.println("Listening failed: Error code:" + errorCode); 
     mNsdManager.stopServiceDiscovery(this); 
    } 
}; 

NsdManager.ResolveListener mResolveListener = new NsdManager.ResolveListener() { 

    @Override 
    public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) { 
     // Called when the resolve fails. Use the error code to debug. 
     System.out.println("Listening Resolve failed " + errorCode); 
     System.out.println("Listening serivce = " + serviceInfo); 
    } 

    @Override 
    public void onServiceResolved(NsdServiceInfo serviceInfo) { 
     System.out.println("Listening . " + serviceInfo.getServiceName()); 

     if (serviceInfo.getServiceName().equals(SERVICE_NAME)) { 
      System.out.println("Listening port " + serviceInfo); 
      return; 
     } 

     // Obtain port and IP 

     hostPort = serviceInfo.getPort(); 
     hostAddress = serviceInfo.getHost(); 
     System.out.println("Listening port " + hostPort); 
     System.out.println("Listening ip " + hostAddress); 
    } 
}; 

サーバー

public class ServerActivity extends Activity { 

private String SERVICE_NAME = "Server device"; 
private String SERVICE_TYPE = "_http._tcp."; 
private NsdManager mNsdManager; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // setContentView and other stuff 

    mNsdManager = (NsdManager) getSystemService(ServerActivity.NSD_SERVICE); 
    registerService(9000); 
} 

@Override 
protected void onPause() { 
    if (mNsdManager != null) { 
     mNsdManager.unregisterService(mRegistrationListener); 
    } 
    super.onPause(); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    if (mNsdManager != null) { 
     registerService(9000); 
    } 

} 

@Override 
protected void onDestroy() { 
    if (mNsdManager != null) { 
     mNsdManager.unregisterService(mRegistrationListener); 
    } 
    super.onDestroy(); 
} 

public void registerService(int port) { 
    NsdServiceInfo serviceInfo = new NsdServiceInfo(); 
    serviceInfo.setServiceName(SERVICE_NAME); 
    serviceInfo.setServiceType(SERVICE_TYPE); 
    serviceInfo.setPort(port); 

    mNsdManager.registerService(serviceInfo, 
      NsdManager.PROTOCOL_DNS_SD, 
      mRegistrationListener); 
} 

NsdManager.RegistrationListener mRegistrationListener = new NsdManager.RegistrationListener() { 

    @Override 
    public void onServiceRegistered(NsdServiceInfo NsdServiceInfo) { 
     String mServiceName = NsdServiceInfo.getServiceName(); 
     SERVICE_NAME = mServiceName; 
     System.out.println("Listening Registered name : " + mServiceName); 
    } 

    @Override 
    public void onRegistrationFailed(NsdServiceInfo serviceInfo, 
            int errorCode) { 
     System.out.println("Listening Registered failed : " + errorCode); 
    } 

    @Override 
    public void onServiceUnregistered(NsdServiceInfo serviceInfo) { 
     // Service has been unregistered. This only happens when you 
     // call 
     // NsdManager.unregisterService() and pass in this listener. 
     System.out.println("Listening Service Unregistered : " + serviceInfo.getServiceName()); 
    } 

    @Override 
    public void onUnregistrationFailed(NsdServiceInfo serviceInfo, 
             int errorCode) { 
     // Unregistration failed. Put debugging code here to determine 
     // why. 
     System.out.println("Listening Unregistration failed : " + errorCode); 
    } 
}; 
関連する問題