android自带的nsd发现服务器,Android网络服务发现(NSD)协议的使用
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)协议的使用相关推荐
- 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 ...
- Android基于NSD实现网络服务发现功能
一. 简介 网络服务发现:一般是指通过此功能,在局域网内来发现同样支持此功能的设备,并跟其他设备建立连接. Android 提供了一个网络服务发现(NSD),可让应用访问其他设备在本地网路上提供的服务 ...
- android nsd和udp广播,Android网络服务发现(NSD)使用
Android网络服务发现(NSD)使用 NSD(NsdManager)是Android SDK中自带的类库,可以集成直接使用. 使用 NSD服务需要(android4.1及以上) minSdkVer ...
- Android网络服务发现(NSD)协议的使用
Android的网络服务发现协议(NSD)能够用于在小范围的网络中发现邻近设备上的某个应用.这对于一些社交网络.多人游戏类的应用会很有帮助. Android的NSD的用法大致上分为四种操作: 1. 注 ...
- android p2p 连接服务器上,当通过Wi-Fi P2P使用网络服务发现时无法连接到Android设备每个人都可以使用网络服务发现...
! 我正在开发一个Android应用程序,允许与附近已安装此应用程序的设备聊天.为了做到这一点,我使用Wi-Fi P2P API和网络服务发现来搜索附近的设备. 我已经编写了用于在服务启动的线程中搜索 ...
- android 发现服务,Android服务之网络服务发现服务
自android 4.1 开始实现了一个网络服务的发现服务NsdService,其基于苹果的Bonjour服务发现协议,支持远程服务的发现和零配置. Bonjour协议包括IP地址的自动分配.服务名称 ...
- android自带的nsd发现服务器,Android NSD不会发现所有服务
我试图运行一个应用程序使用Android本地服务发现,但有时当我运行该应用程序,它不会发现我的网络的所有服务.我运行的代码从 https://github.com/joeluchoa/nsd使用四个星 ...
- android 上传文件到 c 服务器,android 怎么样用socket给C服务器 发送二进制数据
最近在写一个小APP,卡在android与服务器端通讯上了,大致需求是,android端发送二进制数据,文件头为0x00 0x08 0x0b,后面跟字符串的内容为abcd_efdgh, 结尾用0x00 ...
- android socket 简易聊天室 java服务器,Android Socket通信实现简单聊天室
socket通信是基于底层TCP/IP协议实现的.这种服务端不需要任何的配置文件和tomcat就可以完成服务端的发布,使用纯java代码实现通信.socket是对TCP/IP的封装调用,本身并不是一种 ...
最新文章
- 用钉钉接收zabbix告警
- 微信小程序根据坐标点解析地址常见报错:请求来源未被授权
- linux函数没有返回值导致溢出,Shell中函数返回值超出问题
- mysql连接失败 ping通_哭~问:oracle 数据库有时会突然连接失败,但能ping通主机...
- 揭秘熊猫TV HEVC直播
- 访问 GitHub 的速度很慢?试试这几种方法
- 什么是Google On.Here,以及如何设置?
- oracle使用max提升效率,Oracle调优之利用max与leftjoin来进行不同表之间匹配
- Python3 —— 变量和简单数据类型
- 《工程师文化行为自我分享》_文化对于鼓励创新行为至关重要
- oracle select 变量_详解oracle数据库优化参数--cursor_sharing
- 仿苹果涂鸦软件_有没有仿ios12备忘录便签软件?
- Windows Linux Mac 路由添加删除
- Palindrome Number
- P3317 [SDOI2014]重建
- 阿里图标库iconfont下载和在旧有的iconfont中添加新的图标
- 计算机二级论文题,计算机二级考试真题-Word-小许-质量管理的论文
- Android 蓝牙键盘快捷键
- 环艺考计算机英语吗,应届考取北理环艺分享|愿汗水泪水都不会被辜负!
- 《软技能》读书笔记——职业篇
热门文章
- MySQL: linux mysql access denied for user ‘root’@’localhost'(using password:YES)
- Nginx:安装+测试
- 在html中引入jQuery包的方法
- java.lang.NoSuchMethodError: antlr.collections.AST.g(truts2与hibernate jar包(antlr-2.7.2.jar)冲突)
- 第十届蓝桥杯java B组—试题C 数列求值
- java速算24,Java扑克牌速算24的方法
- linux 查询线程是否结束_批量随机键值查询测试
- Android访问瓦片地图 费流量,瓦片地图注意事项
- 2020年度国家绿色数据中心名单正式发布
- 综合布线五大技巧与综合布线规范详解