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() {
@Override
public void onUnregistrationFailed(NsdServiceInfo arg0, int arg1) {
Toast.makeText(getApplicationContext(), "Unregistration Failed", Toast.LENGTH_SHORT).show();
} @Override
public void onServiceUnregistered(NsdServiceInfo arg0) {
Toast.makeText(getApplicationContext(), "Service Unregistered", Toast.LENGTH_SHORT).show();
} @Override
public void onServiceRegistered(NsdServiceInfo arg0) {
Toast.makeText(getApplicationContext(), "Service Registered", Toast.LENGTH_SHORT).show();
} @Override
public 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() {
@Override
public void onStopDiscoveryFailed(String serviceType, int errorCode) {
Toast.makeText(getApplicationContext(), "Stop Discovery Failed", Toast.LENGTH_SHORT).show();
} @Override
public void onStartDiscoveryFailed(String serviceType, int errorCode) {
Toast.makeText(getApplicationContext(),
"Start Discovery Failed", Toast.LENGTH_SHORT).show();
} @Override
public void onServiceLost(NsdServiceInfo serviceInfo) {
Toast.makeText(getApplicationContext(), "Service Lost", Toast.LENGTH_SHORT).show();
} @Override
public void onServiceFound(NsdServiceInfo serviceInfo) {
// 发现网络服务时就会触发该事件
// 能够通过switch或if获取那些你真正关心的服务
Toast.makeText(getApplicationContext(), "Service Found", Toast.LENGTH_SHORT).show();
} @Override
public void onDiscoveryStopped(String serviceType) {
Toast.makeText(getApplicationContext(), "Discovery Stopped", Toast.LENGTH_SHORT).show();
} @Override
public 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() {
@Override
public void onServiceResolved(NsdServiceInfo arg0) {
// 能够再这里获取对应网络服务的地址及port信息,然后决定是否要与之建立连接。
// 之后就是一些socket操作了
} @Override
public 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设备之间相同应用程序的网络服务发现功能

    在我们的app中添加网络服务发现功能(NSD)以方便在不同的设备上响应局域网中的请求.这种功能对于多设备之间点对点服务来说很有用,例如多人游戏,多人通话,文件共享等. 一,在网络中注册你的服务 注意: ...

  2. Android 网络服务介绍

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

  3. 从零开始入门 | Kubernetes 中的服务发现与负载均衡

    作者 | 阿里巴巴技术专家  溪恒 一.需求来源 为什么需要服务发现 在 K8s 集群里面会通过 pod 去部署应用,与传统的应用部署不同,传统应用部署在给定的机器上面去部署,我们知道怎么去调用别的机 ...

  4. Kubernetes 中的服务发现与负载均衡

    原文:https://www.infoq.cn/article/rEzx9X598W60svbli9aK (本文转载自阿里巴巴云原生微信公众号(ID:Alicloudnative)) 一.需求来源 为 ...

  5. 《metasploit渗透测试魔鬼训练营》学习笔记第五章--网络服务渗透攻击

    三.网络服务渗透攻击 3.1 内存攻防技术      3.1.1 缓冲区溢出漏洞机理              缓冲区溢出是程序由于缺乏对缓冲区的边界条件检查而引起的一种异常行为.           ...

  6. Android网络编程系列 一 TCP/IP协议族

    在学习和使用Android网路编程时,我们接触的仅仅是上层协议和接口如Apache的httpclient或者Android自带的httpURlconnection等等.对于这些接口的底层实现我们也有必 ...

  7. Android网络编程要学的东西与Http协议学习

    本节引言: 本节开始我们来学习Android网络编程相关的一些东西:Android端网络编程是要干嘛?http协议的学习,使用自带扣脚Json解析类解析Json,XML解析常用的几种方式,HttpUr ...

  8. Android网络编程(一)HTTP协议原理

    相关文章 Android网络编程(一)HTTP协议原理 Android网络编程(二)HttpClient与HttpURLConnection Android网络编程(三)Volley使用方法全解析 A ...

  9. Android网络定位服务定制简述

    Android 添加高德或百度网络定位服务 Android的网络定位服务以第三方的APK方式提供服务,由于在国内Android原生自带的com.google.android.gms服务几乎处于不可用状 ...

随机推荐

  1. ASP.NET - 禁用ViewState

    默认情况下,ViewState是被启用的,比如提交表单后,表单中输入的值会自动保留.但是如果不需要保留,也可以将其禁用,这样可以节省资源.   下面3种方式就可以分别禁用某一个控件.某一个页面和整个应 ...

  2. hdu 4710 Balls Rearrangement 数论

    这个公倍数以后是循环的很容易找出来,然后循环以内的计算是打表找的规律,规律比较难表述,自己看代码吧.. #include <iostream> #include <cstdio> ...

  3. Swift - 数组排序方法(附样例)

    下面通过一个样例演示如何对数组元素进行排序.数组内为自定义用户对象,最终要实现按用户名排序,数据如下: 1 2 3 4 var userList = [UserInfo]() userList.app ...

  4. Extract Datasets

    *&---------------------------------------------------------------------* *& Report ZTEST2013 ...

  5. 【ASP.NET Web API教程】3.4 HttpClient消息处理器

    原文:[ASP.NET Web API教程]3.4 HttpClient消息处理器 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容. 3.4 ...

  6. mysql 创建函数 error Code: 1227. Access denied;

    mysql> show function status; +------+------------------+----------+------------+----------------- ...

  7. TCP_NODELAY详解

    在网络拥塞控制领域,我们知道有一个非常有名的算法叫做Nagle算法(Nagle algorithm),这是使用它的发明人John Nagle的名字来命名的,John Nagle在1984年首次用这个算 ...

  8. eclipse weblogic debug 简易配置版

    1. eclipse->help->marketplace->search->weblogic 1.1安装对应eclipse版本的weblogic plugin 查看eclip ...

  9. <一年成为Emacs高手>更新到20130706版

    这次更新比较多,加了第三方精品插件推荐,添加了我认为不错的Emacs社区. 见 原文

  10. [to do list][PCB][questions]and[plan]

    Questions 2014/5/29 1.最后检查布板,除了用netlist查,还有没有更快的方法? 2014/6/8 1.      R的location中心究竟是哪个? watermark/2/ ...