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);

}

三. 连接网络服务

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

public void initResolveListener(View view) {

nsResolveListener = new NsdManager.ResolveListener() {

@Override

public void onServiceResolved(NsdServiceInfo arg0) {

// 可以再这里获取相应网络服务的地址及端口信息,然后决定是否要与之建立连接。

// 之后就是一些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/article/details/37968501

android自带的nsd发现服务器,Android网络服务发现(NSD)协议的使用相关推荐

  1. 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 ...

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

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

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

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

  4. Android网络服务发现(NSD)协议的使用

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

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

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

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

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

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

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

  8. android 上传文件到 c 服务器,android 怎么样用socket给C服务器 发送二进制数据

    最近在写一个小APP,卡在android与服务器端通讯上了,大致需求是,android端发送二进制数据,文件头为0x00 0x08 0x0b,后面跟字符串的内容为abcd_efdgh, 结尾用0x00 ...

  9. android socket 简易聊天室 java服务器,Android Socket通信实现简单聊天室

    socket通信是基于底层TCP/IP协议实现的.这种服务端不需要任何的配置文件和tomcat就可以完成服务端的发布,使用纯java代码实现通信.socket是对TCP/IP的封装调用,本身并不是一种 ...

最新文章

  1. 用钉钉接收zabbix告警
  2. 微信小程序根据坐标点解析地址常见报错:请求来源未被授权
  3. linux函数没有返回值导致溢出,Shell中函数返回值超出问题
  4. mysql连接失败 ping通_哭~问:oracle 数据库有时会突然连接失败,但能ping通主机...
  5. 揭秘熊猫TV HEVC直播
  6. 访问 GitHub 的速度很慢?试试这几种方法
  7. 什么是Google On.Here,以及如何设置?
  8. oracle使用max提升效率,Oracle调优之利用max与leftjoin来进行不同表之间匹配
  9. Python3 —— 变量和简单数据类型
  10. 《工程师文化行为自我分享》_文化对于鼓励创新行为至关重要
  11. oracle select 变量_详解oracle数据库优化参数--cursor_sharing
  12. 仿苹果涂鸦软件_有没有仿ios12备忘录便签软件?
  13. Windows Linux Mac 路由添加删除
  14. Palindrome Number
  15. P3317 [SDOI2014]重建
  16. 阿里图标库iconfont下载和在旧有的iconfont中添加新的图标
  17. 计算机二级论文题,计算机二级考试真题-Word-小许-质量管理的论文
  18. Android 蓝牙键盘快捷键
  19. 环艺考计算机英语吗,应届考取北理环艺分享|愿汗水泪水都不会被辜负!
  20. 《软技能》读书笔记——职业篇

热门文章

  1. MySQL: linux mysql access denied for user ‘root’@’localhost'(using password:YES)
  2. Nginx:安装+测试
  3. 在html中引入jQuery包的方法
  4. java.lang.NoSuchMethodError: antlr.collections.AST.g(truts2与hibernate jar包(antlr-2.7.2.jar)冲突)
  5. 第十届蓝桥杯java B组—试题C 数列求值
  6. java速算24,Java扑克牌速算24的方法
  7. linux 查询线程是否结束_批量随机键值查询测试
  8. Android访问瓦片地图 费流量,瓦片地图注意事项
  9. 2020年度国家绿色数据中心名单正式发布
  10. 综合布线五大技巧与综合布线规范详解