注:文章大部分内容来源于http://blog.csdn.net/gophers/article/details/37968501,以下为个人梳理内容,限于水平,错误难免,望包含指正!

公司研发的主机使用Bonjour暴露自己的ip以供客户端搜寻,个人改写上述文章源码后大致整理流程如下,最终成功获得局域网下目标主机的ip地址

1.设置需要查找的设备的ServiceName和ServiceType,均为事先定义好的字符串:

//    目标设备名称及类型public static final String SERVICE_NAME = "test";public static final String SERVICE_TYPE = "_nb._tcp.";

2.配置Nsd服务的参数对象NsdServiceInfo,端口设为0对应自动获取IP(常用)

//        注册网络服务的名称、类型、端口NsdServiceInfo nsdServiceInfo = new NsdServiceInfo();nsdServiceInfo.setServiceName(SERVICE_NAME);nsdServiceInfo.setServiceType(SERVICE_TYPE);nsdServiceInfo.setPort(0);

3.准备Nsd服务所需NsdManager对象及三种Nsd服务回调监听器

//    nsdManager对象NsdManager nsdManager = null;//    注册监听器NsdManager.RegistrationListener registerListener = null;//    解析监听器NsdManager.ResolveListener resolveListener = null;//    搜寻监听器NsdManager.DiscoveryListener discoverListener = null;

4.创建三类监听器之一:注册监听器

// 实现一个网络服务的注册事件监听器,监听器的对象应该保存起来以便之后进行注销NsdManager.RegistrationListener nsRegListener = new NsdManager.RegistrationListener() {@Overridepublic void onUnregistrationFailed(NsdServiceInfo arg0, int arg1) {Toast.makeText(getApplicationContext(), "Unregistration Failed", Toast.LENGTH_SHORT).show();LogErr("注销失败");}@Overridepublic void onServiceUnregistered(NsdServiceInfo arg0) {Toast.makeText(getApplicationContext(), "Service Unregistered", Toast.LENGTH_SHORT).show();LogDebug("注销完成");}@Overridepublic void onServiceRegistered(NsdServiceInfo arg0) {Toast.makeText(getApplicationContext(), "Service Registered", Toast.LENGTH_SHORT).show();LogDebug("注册完成");}@Overridepublic void onRegistrationFailed(NsdServiceInfo arg0, int arg1) {Toast.makeText(getApplicationContext(), "Registration Failed", Toast.LENGTH_SHORT).show();LogErr("注册失败");}};return nsRegListener;}

5.创建三类监听器之二解析监听器

/*** 获取解析监听器** @return*/public NsdManager.ResolveListener getResolveListener() {NsdManager.ResolveListener listener = new NsdManager.ResolveListener() {@Overridepublic void onResolveFailed(NsdServiceInfo nsdServiceInfo, int i) {LogErr("解析失败");}@Overridepublic void onServiceResolved(NsdServiceInfo nsdServiceInfo) {LogDebug("解析成功,名称-->" + nsdServiceInfo.getHost());
//                注销服务unregisterNsdService();}};return listener;}

6.创建三类监听器之三搜寻监听器

/*** 调用设置好的nsdManager 搜寻服务** @param nsdManager*/public NsdManager.DiscoveryListener discoverService(NsdManager nsdManager) {NsdManager.DiscoveryListener nsDicListener = new NsdManager.DiscoveryListener() {@Overridepublic void onStopDiscoveryFailed(String serviceType, int errorCode) {Toast.makeText(getApplicationContext(), "Stop Discovery Failed", Toast.LENGTH_SHORT).show();LogErr("Stop Discovery Failed");}@Overridepublic void onStartDiscoveryFailed(String serviceType, int errorCode) {Toast.makeText(getApplicationContext(), "Start Discovery Failed", Toast.LENGTH_SHORT).show();LogErr("Start Discovery Failed");}@Overridepublic void onServiceLost(NsdServiceInfo serviceInfo) {Toast.makeText(getApplicationContext(), "Service Lost", Toast.LENGTH_SHORT).show();LogErr("Service Lost");}@Overridepublic void onServiceFound(NsdServiceInfo serviceInfo) {// 发现网络服务时就会触发该事件// 可以通过switch或if获取那些你真正关心的服务Toast.makeText(getApplicationContext(), "Service Found", Toast.LENGTH_SHORT).show();LogDebug("Service Found,serviceName-->" + serviceInfo.getServiceName());}@Overridepublic void onDiscoveryStopped(String serviceType) {Toast.makeText(getApplicationContext(), "Discovery Stopped", Toast.LENGTH_SHORT).show();LogDebug("Discovery Stopped");}@Overridepublic void onDiscoveryStarted(String serviceType) {Toast.makeText(getApplicationContext(), "Discovery Started", Toast.LENGTH_SHORT).show();LogDebug("Discovery Started");}};return nsDicListener;}

7.实例化NsdManager对象并设置以上三种监听器

//        获取注册监听器registerListener = getRegistrationListener();
//        注册网络服务的名称、类型、端口NsdServiceInfo nsdServiceInfo = new NsdServiceInfo();nsdServiceInfo.setServiceName(SERVICE_NAME);nsdServiceInfo.setServiceType(SERVICE_TYPE);nsdServiceInfo.setPort(port);
//        获取系统网络服务管理器,准备之后进行注册nsdManager = (NsdManager) getApplicationContext().getSystemService(Context.NSD_SERVICE);
//        设置注册监听器并开始注册nsdManager.registerService(nsdServiceInfo, NsdManager.PROTOCOL_DNS_SD, registerListener);
//        设置解析服监听器resolveListener = getResolveListener();nsdManager.resolveService(nsdServiceInfo, resolveListener);
//        设置搜寻监听器并开始搜寻discoverListener = discoverService(nsdManager);nsdManager.discoverServices(SERVICE_NAME, NsdManager.PROTOCOL_DNS_SD, discoverListener);

完成以上步骤,运行即可搜寻网络下ServiceName为"test",ServiceType为"_nb._tcp."的设备了,如愿获得了公司网络下主机的正确IP(...2.188):

注意事项

1.Internet权限

2.据说这个服务耗电量非常大不知是真是假,搜寻到服务后最好注销服务:

/*** 搜寻完成 注销服务*/private void unregisterNsdService() {if (null != nsdManager) {nsdManager.stopServiceDiscovery(discoverListener);nsdManager.unregisterService(registerListener);LogDebug("注销完成!");}}

一知半解,不会看API,误人子弟媳妇概不负责,欢迎交流

android网络设备搜寻Nsd服务基本用法相关推荐

  1. Android 通过 NSD 服务 Netty(断线重连、心跳、黏包处理) 实现两个 Android 系统端的长连接通讯

    引言 近期需求,通过手机App端取号机(含叫号通知功能),实时连接 另一台 Android 广告机用于播放当前被叫到的号数. 这里有两种Android 机 一台「基于Sunmi版的可出小票的Andro ...

  2. android NSD服务详解

    android NSD服务详解 一.NSD的基础知识: NSD全称为: Network Service Discovery.翻译过来的意思就是发现服务器网络的意思.理解的说就是:发现服务器对应的网络信 ...

  3. Android Service的onStartCommand返回值用法

    2019独角兽企业重金招聘Python工程师标准>>> Android Service的onStartCommand返回值用法 本文目的:使读者快速理解 1.START_STICKY ...

  4. Android应用程序绑定服务(bindService)的过程源代码分析

    Android应用程序组件Service与Activity一样,既可以在新的进程中启动,也可以在应用程序进程内部启动:前面我们已经分析了在新的进程中启动Service的过程,本文将要介绍在应用程序内部 ...

  5. Android数据存储几种方式用法总结

    Android数据存储几种方式用法总结 1.概述 Android提供了5种方式来让用户保存持久化应用程序数据.根据自己的需求来做选择,比如数据是否是应用程序私有的,是否能被其他程序访问,需要多少数据存 ...

  6. android 后台服务拍照,Android实现后台开启服务默默拍照功能

    本文实例为大家分享了Android后台开启服务默默拍照的具体代码,供大家参考,具体内容如下 最近项目原因,需要编写一后台运行的程序,在给定时间间隔下进行拍照,关键技术主要是:1.开启服务:2.在不不预 ...

  7. android studio 如何提示方法的用法

    方法/步骤1在 Eclipse中鼠标放上去就可以提示方法的用法,实际上Android Studio也可以设置的.如图 Preferences > Editor >Generan> S ...

  8. 解决android客户端上传图片到服务端时,图片损坏的问题

    解决android客户端上传图片到服务端时,图片损坏的问题 参考文章: (1)解决android客户端上传图片到服务端时,图片损坏的问题 (2)https://www.cnblogs.com/cnbl ...

  9. Android开发--用户定位服务--UserLocation

    用户定位介绍: User Location的作用: 1.获取用户的位置 2.追踪用户的移动 User Location的关键API 1.Location Manager:用于管理Android的用户定 ...

最新文章

  1. 登录功能和公聊功能的实现
  2. Python使用aiohttp异步爬取糗事百科
  3. internal error:failed to get path of 64-bit Program Files directory
  4. wxWidgets:wxString概述
  5. mybatis批量插入oracle报表达式,mybatis oracle两种方式批量插入数据
  6. iphone11什么时候上市_hd3手表高仿哪里买 什么时候上市?
  7. 三阶段dea模型 matlab源程序,三阶段DEA模型SFA二阶段剔除过程
  8. centos重启mysql_CentOS 7下启动、关闭、重启、查看MySQL服务
  9. 基于JAVA+SpringMVC+Mybatis+MYSQL的奖助学金贷款信息管理系统
  10. 一个服务器端和多个客户端消息互发_python:OSError: [WinError 10022] 提供了一个无效的参数...
  11. Leetcode 刷题笔记(二十三) ——动态规划篇之基础题目
  12. 每日一技|活锁,也许你需要了解一下
  13. mysql用户表怎么命名_数据库表的命名规范
  14. 下载阿里云大学的课程
  15. python编写poc_Poc编写
  16. Apache Jena TDB 增删改查操作
  17. 家庭服务机器人的人脸检测、跟踪与识别研究
  18. Ext JS框架入门
  19. android版本 51,51星变手机版
  20. scp拷贝文件报错-bash: scp: command not found

热门文章

  1. VUE 输入框disabled颜色问题解决
  2. java构造单例线程池_java中常见的六种线程池详解
  3. InkScape绘制抖音LOGO的教程
  4. php实现dota天梯、wow竞技场、lol排位赛匹配加分算法ELO
  5. 如何制定月工作计划?——我的项目管理心得
  6. 一起Talk Android吧(第四百零五回:画布的变换)
  7. 【Tsinghua】无线广播(broadcast)
  8. 计算正三角形外接圆的面积
  9. Uniapp(H5)判断软键盘是否唤起、关闭事件
  10. 手把手教你配置Redis主从复制(含详细图文)