美文网首页android
使用NSD(Network Service Discovery

使用NSD(Network Service Discovery

作者: changchengfeng | 来源:发表于2016-12-19 12:04 被阅读676次

    1.使用nsd必须连接在同一网段(多个Android设备连接同一个热点)
    2.其中的所有Listener只能使用一次,不能多次使用注册,查找,连接。

    1.其中一个设备必须先注册为nsd服务进行广播

    1.1创建NsdServiceInfo对象
        NsdServiceInfo serviceInfo  = new NsdServiceInfo();
    //设置名字(若出现重名的系统自动加上NsdChat (1))
        serviceInfo.setServiceName("NsdChat");
    //设置连接类型使用基于tcp的http协议进行传输
        serviceInfo.setServiceType("_http._tcp.");
    //为避免端口冲突,可使用以下代码获取一个可用的端口号
     // Initialize a server socket on the next available port.
        mServerSocket = new ServerSocket(0);
        // Store the chosen port.
        mLocalPort =  mServerSocket.getLocalPort();
    //设置端口号
        serviceInfo.setPort(port);
    
    1.2创建NsdManager.RegistrationListener
     mRegistrationListener = new NsdManager.RegistrationListener() {
    
            @Override
            public void onServiceRegistered(NsdServiceInfo NsdServiceInfo) {
                // Save the service name.  Android may have changed it in order to
                // resolve a conflict, so update the name you initially requested
                // with the name Android actually used.
                mServiceName = NsdServiceInfo.getServiceName();
            }
    
            @Override
            public void onRegistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
                // Registration failed!  Put debugging code here to determine why.
            }
    
            @Override
            public void onServiceUnregistered(NsdServiceInfo arg0) {
                // Service has been unregistered.  This only happens when you call
                // NsdManager.unregisterService() and pass in this listener.
            }
    
            @Override
            public void onUnregistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
                // Unregistration failed.  Put debugging code here to determine why.
            }
        };
    
    
    1.3注册
     NsdManager mNsdManager = Context.getSystemService(Context.NSD_SERVICE);
        mNsdManager.registerService(
                serviceInfo, NsdManager.PROTOCOL_DNS_SD, mRegistrationListener);
    
    

    2.当有设备注册NSD服务的时候,其他设备就可进行查找

    mNsdManager.discoverServices(
            "_http._tcp.", NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener);
    
     // Instantiate a new DiscoveryListener
        mDiscoveryListener = new NsdManager.DiscoveryListener() {
    
            //  Called as soon as service discovery begins.
            @Override
            public void onDiscoveryStarted(String regType) {
                Log.d(TAG, "Service discovery started");
            }
    
            @Override
            public void onServiceFound(NsdServiceInfo service) {
                // A service was found!  Do something with it.
                Log.d(TAG, "Service discovery success" + service);
                if (!service.getServiceType().equals(SERVICE_TYPE)) {
                    // Service type is the string containing the protocol and
                    // transport layer for this service.
                    Log.d(TAG, "Unknown Service Type: " + service.getServiceType());
                } else if (service.getServiceName().equals(mServiceName)) {
                    // The name of the service tells the user what they'd be
                    // connecting to. It could be "Bob's Chat App".
                    Log.d(TAG, "Same machine: " + mServiceName);
                } else if (service.getServiceName().contains("NsdChat")){
                    mNsdManager.resolveService(service, mResolveListener);
                }
            }
    
            @Override
            public void onServiceLost(NsdServiceInfo service) {
                // When the network service is no longer available.
                // Internal bookkeeping code goes here.
                Log.e(TAG, "service lost" + service);
            }
    
            @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);
            }
        };
    
    

    3.连接服务

    查找到服务就会调用 public void onServiceFound(NsdServiceInfo service)

     mNsdManager.resolveService(service, mResolveListener);
      mResolveListener = new NsdManager.ResolveListener() {
    
            @Override
            public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) {
                // Called when the resolve fails.  Use the error code to debug.
                Log.e(TAG, "Resolve failed" + errorCode);
            }
    
            @Override
            public void onServiceResolved(NsdServiceInfo serviceInfo) {
                Log.e(TAG, "Resolve Succeeded. " + serviceInfo);
    
                if (serviceInfo.getServiceName().equals(mServiceName)) {
                    Log.d(TAG, "Same IP.");
                    return;
                }
                mService = serviceInfo;
                int port = mService.getPort();
                InetAddress host = mService.getHost();
            }
        };
    
    

    4.使用Socket进行通信

    在 public void onServiceResolved(NsdServiceInfo serviceInfo) 即可获取到服务的地址和端口号就可进行通信

    5.关闭查找设备,关闭注册服务

    mNsdManager.stopServiceDiscovery(mDiscoveryListener);
      mNsdManager.unregisterService(mRegistrationListener);
    

    相关文章

      网友评论

        本文标题:使用NSD(Network Service Discovery

        本文链接:https://www.haomeiwen.com/subject/reftvttx.html