2016-08-22 3 views
2

J'ai récemment commencé à travailler sur la découverte de services réseau fournie par Android.Service NsdManager introuvable après enregistrement de l'android

J'ai fait deux applications connectées sur le même réseau. On enregistrer un service avec cette classe:

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); 
} 
} 

L'autre application découvrira tous les services sur le réseau avec cette classe:

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); 
} 
} 

Le registre va bien, mais la découverte ne trouve pas mon service. Je suis connecté sur le même réseau pour les deux applications.

Je ne sais pas où est le problème.

S'il vous plaît aidez-moi,

Merci

Répondre

0

Cela a parfaitement fonctionné pour moi.

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); 
    } 
}; 

serveur

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); 
    } 
};