网络公司网站asp,北京的广告公司网站建设,网站建设培训需要多少钱,网站开发工程师岗位描述近期在了解局域网发现服务的时候无意间看到Android 自带的#xff08;Network Service Discovery#xff09;网络发现服务#xff0c;在一番验证之后发现实现比较简单#xff0c;可靠性也高#xff0c;因此在这里做一个整理#xff0c;算是对自己知识做一个归档。
网络服…近期在了解局域网发现服务的时候无意间看到Android 自带的Network Service Discovery网络发现服务在一番验证之后发现实现比较简单可靠性也高因此在这里做一个整理算是对自己知识做一个归档。
网络服务发现NSD是一种机制它允许设备在本地网络上相互发现并提供服务。在Android平台上NSD API使得应用可以轻松地发现和注册网络上的服务。以下是NSD的一些关键点和如何在Android应用中使用它
1.NSD的基本概念 NSD实现了基于DNS的服务发现DNS-SD机制允许应用通过指定服务类型和名称来请求服务。这使得用户可以发现并连接到其他设备上运行的相同应用适用于文件共享、多人游戏等点对点应用。
2.注册服务 在本地网络上注册服务是可选的。如果需要注册服务首先需要创建一个NsdServiceInfo对象该对象提供了其他设备在决定是否连接到您的服务时所需的信息。服务名称是实例名称对网络上的其他设备可见且必须是唯一的。服务类型指定了应用使用的协议和传输层例如_http._tcp表示通过TCP运行的HTTP协议关于协议列表可以在该网页中查到 Service Name and Transport Protocol Port Number Registry 。
3.发现服务 要发现网络上的服务需要设置一个发现监听器并调用discoverServices()方法。监听器会通知应用何时启动、何时发生故障以及何时发现和丢失服务。
4.权限要求 使用NSD服务需要在应用的AndroidManifest.xml文件中添加网络权限如INTERNET权限。
5.示例代码 代码中有完整的注释这里就不再过多赘述。
注册服务的示例代码
public class NsdService implements NsdManager.RegistrationListener {private final NsdManager mNsdManager;/*** 自定义服务名称该名称对局域网内使用NSD查找本地服务的设备可见。* 名称必须唯一但是如果网络中有同名的服务安卓系统会自动处理冲突其中一个会被自动转换为类似MyService1这样的名称。*/private String mServiceName MyService;/*** 服务类型,即指定应用使用的协议和传输层。* 语法是“_ protocol ._ transportlayer ”,这里服务使用了TCP协议上的HTTP协议。* 想要提供打印服务例如一台网络打印机的应用应该将服务的类型设置为“_ipp._tcp”。* 其他协议可以IANA中查看到https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml*/private String mServiceType _http._tcp.;NsdService(Context context) {mNsdManager (NsdManager) context.getSystemService(Context.NSD_SERVICE);}/*** 注册服务* param port 网络服务的端口*/public void registerService(int port) {//创建了一个NsdServiceInfo 并传入端口、服务名称和协议NsdServiceInfo serviceInfo new NsdServiceInfo();//这里是你要告诉发现端你的网络服务的端口可能是你的server socket的启动端口切记非NSD的启动端口。serviceInfo.setPort(port);serviceInfo.setServiceName(mServiceName);serviceInfo.setServiceType(mServiceType);//注册NAS服务此处最后一个参数是NsdManager.RegistrationListener监听mNsdManager.registerService(serviceInfo,NsdManager.PROTOCOL_DNS_SD,this);}Overridepublic void onServiceRegistered(NsdServiceInfo NsdServiceInfo) {Log.d(NSD, Service registered: NsdServiceInfo.getServiceName());}Overridepublic void onRegistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {Log.e(NSD, Registration failed: Error code: errorCode);}Overridepublic void onServiceUnregistered(NsdServiceInfo arg0) {Log.d(NSD, Service unregistered);}Overridepublic void onUnregistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {Log.e(NSD, Unregistration failed: Error code: errorCode);}
}发现服务的示例代码
public class NsdDiscovery implements NsdManager.DiscoveryListener {private final NsdManager mNsdManager;/*** 服务类型,即指定应用使用的协议和传输层。* 语法是“_ protocol ._ transportlayer ”,这里服务使用了TCP协议上的HTTP协议。* 想要提供打印服务例如一台网络打印机的应用应该将服务的类型设置为“_ipp._tcp”。* 其他协议可以IANA中查看到https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml*/private String mServiceType _http._tcp.;NsdDiscovery(Context context) {mNsdManager (NsdManager) context.getSystemService(Context.NSD_SERVICE);}//发现服务public void discoverServices() {//发现服务需要添加DiscoveryListener监听关于发现服务所有的信息会在该回调内通知mNsdManager.discoverServices(mServiceType,NsdManager.PROTOCOL_DNS_SD,this);}Overridepublic void onStartDiscoveryFailed(String serviceType, int errorCode) {Log.e(NSD, Discovery start failed: Error code: errorCode);}Overridepublic void onStopDiscoveryFailed(String serviceType, int errorCode) {Log.e(NSD, Discovery stop failed: Error code: errorCode);}Overridepublic void onDiscoveryStarted(String serviceType) {Log.d(NSD, Service discovery started);}Overridepublic void onDiscoveryStopped(String serviceType) {Log.d(NSD, Discovery stopped: serviceType);}/*** 网络内发现了服务* param serviceInfo*/Overridepublic void onServiceFound(NsdServiceInfo serviceInfo) {Log.d(NSD, Service discovery success serviceInfo);//检查服务的类型确认这个类型我们的应用是否可以接入。if (!serviceInfo.getServiceType().equals(mServiceType)) {Log.d(NSD, Unknown Service Type: serviceInfo.getServiceType());}//比较找到服务的名称与本地服务的名称判断设备是否获得自己的合法的广播。else if (serviceInfo.getServiceName().contains(MyService)) {//如果是自己的服务需要再进一步解析服务端的信息,包括IP和端口。mNsdManager.resolveService(serviceInfo, new ResolveListener());}}Overridepublic void onServiceLost(NsdServiceInfo serviceInfo) {Log.e(NSD, service lost serviceInfo);}private class ResolveListener implements NsdManager.ResolveListener {Overridepublic void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) {Log.e(NSD, Resolve failed errorCode);}//解析完成之后通知Overridepublic void onServiceResolved(NsdServiceInfo serviceInfo) {Log.d(NSD, Resolve Succeeded. serviceInfo);// 连接到服务端的代码//...}}
}
不要忘记添加权限 uses-permission android:nameandroid.permission.INTERNET /