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. MTU & MSS 详解记录(转)

              先学习理解一下帧的封装格式:   需要注意的是,区别两种帧封装格式:802标准帧和以太网帧 1,在802标准定义的帧格式中,长度字段是指它后续数据的字节长度,但不包括C R C检验 ...

  2. jd.py

    #!/usr/bin/env python #coding:utf-8 import urllib2,re,sys,os,types #from bs4 import BeautifulSoup re ...

  3. System Request 进入KDB模式过程详解

    0   echo g > /proc/sysrq-trigger   怎么让系统停下来,进入进入KDB循环? 1   需要简单了解下:Linux Magic System Request 2   ...

  4. [Android学习笔记]Fragment使用

    一.android.app.Fragment 与 android.support.v4.app.Fragment 区别 support.v4.app.Fragment是为了给低版本Android使用的 ...

  5. 打开excel2007文档时显示“excel无法打开文件~$book.xltm”

    此问题的出现是因为意外情况导致Excel临时文件没有删掉,把C:\Program Files\Microsoft Office\Office12\XLSTART里面的临时文件“~$book”给删除就好 ...

  6. uva 10069 Distinct Subsequences(高精度 + DP求解子串个数)

    题目连接:10069 - Distinct Subsequences 题目大意:给出两个字符串x (lenth < 10000), z (lenth < 100), 求在x中有多少个z. ...

  7. [置顶] Asp.Net---css样式的使用方式

    Css样式的使用大致分为三种 咱们先来看看一张总括图 1 使用连接的形式调用 有两种发方式调用: A   使用link标签 将样式规则写在.Css的样式文档中,再以<link>标签引入 如 ...

  8. Python Errors and Exceptions

    1. python中的try{}catch{} 2. raise exception 3. try...except ... else.. 4. finally块 python中的异常处理的keywo ...

  9. Go成功的项目

    nsq:bitly开源的消息队列系统,性能非常高,目前他们每天处理数十亿条的消息docker:基于lxc的一个虚拟打包工具,能够实现PAAS平台的组建.packer:用来生成不同平台的镜像文件,例如V ...

  10. [计算机基础]HTTP协议学习笔记

    HTTP:Hypertext transfer protocol超文本传输协议是一种详细规定了浏览器和Internet之间互相通信的规则 HTTP允许传输任意类型的数据对象,由Content-Type ...