Android的网络服务发现协议(NSD)能够用于在小范围的网络中发现邻近设备上的某个应用。这对于一些社交网络、多人游戏类的应用会很有帮助。

Android的NSD的用法大致上分为四种操作:

1. 注冊网络服务

2. 发现网络服务

3. 连接网络服务

4. 注销网络服务

使用NSD时一定要注意:

记得在Manifest中增加android.permission.INTERNET 权限,不然程序会崩溃。

一. 注冊网络服务

注冊网络服务须要两样东西: 网络服务的信息(NsdServiceInfo)和注冊事件监听器(NsdManager.RegistrationListener)

这两样东西齐全后就能够通过:NsdManager.registerService发放来注冊网络服务了。

实例代码例如以下:

public void registerService(View view) {// 注意:注冊网络服务时不要对端口进行硬编码,通过例如以下这样的方式为你的网络服务获取// 一个可用的端口号.int port = 0;try {ServerSocket sock = new ServerSocket(0);port = sock.getLocalPort();sock.close();} catch (Exception e) {Toast.makeText(getApplicationContext(), "can not set port", Toast.LENGTH_SHORT);}// 注冊网络服务的名称、类型、端口NsdServiceInfo nsdServiceInfo = new NsdServiceInfo();nsdServiceInfo.setServiceName("NSD_Test_Program");nsdServiceInfo.setServiceType("_http._tcp.");nsdServiceInfo.setPort(port);// 实现一个网络服务的注冊事件监听器。监听器的对象应该保存起来以便之后进行注销nsRegListener = new NsdManager.RegistrationListener() {@Overridepublic void onUnregistrationFailed(NsdServiceInfo arg0, int arg1) {Toast.makeText(getApplicationContext(), "Unregistration Failed", Toast.LENGTH_SHORT).show();}@Overridepublic void onServiceUnregistered(NsdServiceInfo arg0) {Toast.makeText(getApplicationContext(), "Service Unregistered", Toast.LENGTH_SHORT).show();}@Overridepublic void onServiceRegistered(NsdServiceInfo arg0) {Toast.makeText(getApplicationContext(), "Service Registered", Toast.LENGTH_SHORT).show();}@Overridepublic void onRegistrationFailed(NsdServiceInfo arg0, int arg1) {Toast.makeText(getApplicationContext(), "Registration Failed", Toast.LENGTH_SHORT).show();}};// 获取系统网络服务管理器,准备之后进行注冊NsdManager nsdManager = (NsdManager) getApplicationContext().getSystemService(Context.NSD_SERVICE);nsdManager.registerService(nsdServiceInfo, NsdManager.PROTOCOL_DNS_SD, nsRegListener);
}

注意:registerService()方法是异步运行的,假设有一定要在服务注冊完成后才干运行的操作,请在onServiceResgistered事件中执这些操作。

二. 发现网络服务

要发现附近的网络服务须要定义一个网络服务发现时间监听器。代码例如以下:

public void discoverService(View view) {nsDicListener = new NsdManager.DiscoveryListener() {@Overridepublic void onStopDiscoveryFailed(String serviceType, int errorCode) {Toast.makeText(getApplicationContext(), "Stop Discovery Failed", Toast.LENGTH_SHORT).show();}@Overridepublic void onStartDiscoveryFailed(String serviceType, int errorCode) {Toast.makeText(getApplicationContext(),"Start Discovery Failed", Toast.LENGTH_SHORT).show();}@Overridepublic void onServiceLost(NsdServiceInfo serviceInfo) {Toast.makeText(getApplicationContext(), "Service Lost", Toast.LENGTH_SHORT).show();}@Overridepublic void onServiceFound(NsdServiceInfo serviceInfo) {// 发现网络服务时就会触发该事件// 能够通过switch或if获取那些你真正关心的服务Toast.makeText(getApplicationContext(), "Service Found", Toast.LENGTH_SHORT).show();}@Overridepublic void onDiscoveryStopped(String serviceType) {Toast.makeText(getApplicationContext(), "Discovery Stopped", Toast.LENGTH_SHORT).show();}@Overridepublic void onDiscoveryStarted(String serviceType) {Toast.makeText(getApplicationContext(), "Discovery Started", Toast.LENGTH_SHORT).show();}};NsdManager nsdManager = (NsdManager) getApplicationContext().getSystemService(Context.NSD_SERVICE);nsdManager.discoverServices("_http._tcp", NsdManager.PROTOCOL_DNS_SD,nsDicListener);
}

三. 连接网络服务

通过定义一个网络服务连接时间监听器来轮询解析到的网络服务。能够进一步获取该网络服务的地址和port然后决定是否进行连接,演示样例代码:

public void initResolveListener(View view) {nsResolveListener = new NsdManager.ResolveListener() {@Overridepublic void onServiceResolved(NsdServiceInfo arg0) {// 能够再这里获取对应网络服务的地址及port信息,然后决定是否要与之建立连接。// 之后就是一些socket操作了}@Overridepublic void onResolveFailed(NsdServiceInfo arg0, int arg1) {}};
}

四. 注销网络服务

想要注销网络服务,应该事先保存和该网络服务有关的句柄。通过NsdManager.unregisterService和NsdManager.stopServiceDiscovery方法来注销网络服务。实例代码:

public void unregisterService(View view) {NsdManager nsdManager = (NsdManager) getApplicationContext().getSystemService(Context.NSD_SERVICE);nsdManager.stopServiceDiscovery(nsDicListener); // 关闭网络发现nsdManager.unregisterService(nsRegListener);    // 注销网络服务
}

假设转载请注明出处:http://blog.csdn.net/gophers

Android网络服务发现(NSD)协议的使用相关推荐

  1. android自带的nsd发现服务器,Android网络服务发现(NSD)协议的使用

    Android的网络服务发现协议(NSD)可以用于在小范围的网络中发现邻近设备上的某个应用.这对于一些社交网络.多人游戏类的应用会非常有帮助. Android的NSD的使用方法大致上分为四种操作: 1 ...

  2. android nsd和udp广播,Android网络服务发现(NSD)使用

    Android网络服务发现(NSD)使用 NSD(NsdManager)是Android SDK中自带的类库,可以集成直接使用. 使用 NSD服务需要(android4.1及以上) minSdkVer ...

  3. Android基于NSD实现网络服务发现功能

    一. 简介 网络服务发现:一般是指通过此功能,在局域网内来发现同样支持此功能的设备,并跟其他设备建立连接. Android 提供了一个网络服务发现(NSD),可让应用访问其他设备在本地网路上提供的服务 ...

  4. android自带的nsd发现服务器,Android NSD(网络服务发现)是否与iOS中的Bonjour服务兼容?...

    I will create a server-less local networking App for iOS and Android. the App in both iOS and Androi ...

  5. android 发现服务,Android服务之网络服务发现服务

    自android 4.1 开始实现了一个网络服务的发现服务NsdService,其基于苹果的Bonjour服务发现协议,支持远程服务的发现和零配置. Bonjour协议包括IP地址的自动分配.服务名称 ...

  6. android p2p 连接服务器上,当通过Wi-Fi P2P使用网络服务发现时无法连接到Android设备每个人都可以使用网络服务发现...

    ! 我正在开发一个Android应用程序,允许与附近已安装此应用程序的设备聊天.为了做到这一点,我使用Wi-Fi P2P API和网络服务发现来搜索附近的设备. 我已经编写了用于在服务启动的线程中搜索 ...

  7. android 各种服务介绍,Android 网络服务介绍

    1. 介绍 Android网络服务主要包括如下四个部分 -ConnectivityService: 提供数据连接管理服务,包括移动数据.WIFI.以太网等-NetworkPolicyManagerSe ...

  8. Android 网络编程(二) HTTP协议解析

    文章目录 引言 HTTP 简介 什么是HTTP,HTTPS 又是什么? HTTP 协议的特点 HTTP URL 格式 HTTP的报文 请求报文 请求行 请求报头 请求数据 响应保文 状态行 响应报头 ...

  9. android自带的nsd发现服务器,Android NSD不会发现所有服务

    我试图运行一个应用程序使用Android本地服务发现,但有时当我运行该应用程序,它不会发现我的网络的所有服务.我运行的代码从 https://github.com/joeluchoa/nsd使用四个星 ...

最新文章

  1. 随笔 - 141 文章 - 0 评论 - 214 IIS7 禁止目录运行脚本
  2. 深度学习中不变性是什么?平移不变性Translation Invariance、旋转/视角不变性Ratation/Viewpoint Invariance、尺度不变性Size、Illumination
  3. oracle as sydba,oracle用户 sysdba 与system,sysoper的区别
  4. java多态的实现_Java多态的实现机制是什么,写得非常好!
  5. 不止1亿像素相机 小米MIX 4有望首发第四代超声波屏下指纹
  6. pytorch torch.nn.Embedding
  7. java中goto用法源代码,java中goto语句解析12
  8. 如何编写一个d.ts文件
  9. SQL 修改主键约束
  10. PLSQL Developer 64位下载
  11. gis怎么提取水系_arcgis水系提取流程(dem)
  12. vue和echarts实现地图航线
  13. CV520国产兼容应用及说明
  14. python随机图片api_用fastapi搭建随机图api(雁陎二次元随机图api开放试用)
  15. [并发并行]_[pthread]_[使用线程池并发复制文件]
  16. MMQ broker(MQTT 分布式服务器)
  17. DockOne微信分享( 八十八):PPTV聚力传媒的Docker与DevOps
  18. 游戏开发日记(-1):游戏史
  19. 我为啥暂不看好ServiceMesh?
  20. GAN小结(BEGAN EBGAN WGAN CycleGAN conditional GAN DCGAN PGGAN VAEGAN)

热门文章

  1. Intellij IDEA运行报Command line is too long解法
  2. 基础知识 一个工具给win7 win10的同学 或者MAC 可以跳过
  3. C++11实战——多线程的日志类
  4. TED:如何掌控你的自由时间以及让自己变得更好,这样就能看到爱情应有的样子...
  5. CentOS 安装与优化
  6. FIFO跨时钟域读写
  7. text-size-adjust: none并没有什么用
  8. (原)调用jpeglib对图像进行压缩
  9. 【cs229-Lecture19】微分动态规划
  10. Android: 启动另外的APP及传递参数(转)