使用NSD(Network Service Discovery )进行通信

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);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,463评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,631评论 25 709
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,955评论 18 399
  • 我刚开始在简书写文章的时候,本来不是为了让大家都认可我,吸引粉丝。我只是把平日里我记录下来的零零碎碎的想法...
    水由阅读 1,131评论 0 0
  • 随着共享单车日益盛行,犯懒的症状也越来越严重,现在几乎凡出门必开一辆自行车。比如我,就连从学校到地铁站的十几分钟路...
    www8阅读 2,299评论 0 0