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. iOS 使用UIBezierPath类实现随手画画板

    在上一篇文章中我介绍了 UIBezierPath类 介绍 ,下面这篇文章介绍一下如何通过这个类实现一个简单的随手画画板的简单程序demo,功能包括:划线(可以调整线条粗细,颜色),撤销笔画,回撤笔画, ...

  2. Java总结之容器

    [容器的概念] 容器:Java API所提供的一系列的实例,用于在程序中存放对象. [容器 API] J2SDK所提供的容器API位于java.util包内. {Collection[Set(Hash ...

  3. Linux下经常使用的shell命令记录

    硬件篇 CPU相关 lscpu #查看的是cpu的统计信息. cat /proc/cpuinfo #查看CPU信息具体信息,如每一个CPU的型号,主频等 内存相关 free -m #概要查看内存情况 ...

  4. java.util.Queue用法

    队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作.进行插入操作的端称为队尾,进行删除操作的端称为队头.队列中没有元素时,称为空队列. 在队列这 ...

  5. 关键部分CCriticalSection使用

    类CCriticalSection的对象表示一个“临界区”,它是一个用于同步的对象,同一时刻仅仅同意一个线程存取资源或代码区.临界区在控制一次仅仅有一个线程改动数据或其他的控制资源时很实用.比如,在链 ...

  6. 积累的VC编程小技巧之视图

    1.如何得到视图指针 [问题提出]    现在你有一个多线程的Demo,你想在多线程里处理视图指针里的函数,我们给这个函数起个名字:Put();该如何实现呢?   //有两种方法可以实现你的要求:   ...

  7. 【Demo 0002】Java基础-语句

    本章学习要点:        1.  掌握Java关健语句使用方法;          2.  理解与语句相关的关键字用法; 一.Java 关键语句        Java语句以及关联关键字与C完全相 ...

  8. Sql Server中COUNT(字段名)跟COUNT(*)的特殊不同点

    今天有个需求,有2张表: 1.一个“搜索记录”表search,一个“搜索后下载记录”表down 2.映射关系:每一个下载记录对应一条搜索记录,                           第个 ...

  9. Swift - 故事板storyboard的用法

    故事板(UIStoryboard)可以很方便的进行界面的设计,下面总结了常用的几个操作方法: 1,初始场景 选中View Controller,在属性面板里勾选Is Initial View Cont ...

  10. android json 解析 简单示例

    1 下面是一个简单的json 解析的demo,废话不多说,直接上代码 package com.sky.gallery; import java.io.ByteArrayOutputStream; im ...