Android(安卓)NSD注册服务,发现服务
16lz
2021-01-26
import android.content.Context;import android.net.nsd.NsdManager;import android.net.nsd.NsdServiceInfo;import android.util.Log;public class NSDHelper { private static final String TAG = NSDHelper.class.getSimpleName(); private NsdManager.RegistrationListener mRegistrationListener; private NsdManager.DiscoveryListener mDiscoveryListener; private NsdManager mNsdManager; private String mServiceName; public NSDHelper(Context context) { mNsdManager = (NsdManager) context.getApplicationContext().getSystemService(Context.NSD_SERVICE); } /** * 注册NSD 服务,用来广播自己的服务 */ public void registerService(String serviceName, int port, NsdManager.RegistrationListener listener) { mServiceName = (serviceName == null) ? Constants.NSD_SERVER_DEFAULT_NAME : serviceName; NsdServiceInfo serviceInfo = new NsdServiceInfo(); serviceInfo.setPort(port); serviceInfo.setServiceName(mServiceName); serviceInfo.setServiceType(Constants.NSD_SERVER_TYPE); initRegisterationListener(listener); mNsdManager.registerService(serviceInfo, NsdManager.PROTOCOL_DNS_SD, mRegistrationListener); } /** * 取消注册服务 */ public void unRegisterService() { mNsdManager.unregisterService(mRegistrationListener); } private void initRegisterationListener(NsdManager.RegistrationListener listener) { if (listener == null) { createDefaultListener(); } else { mRegistrationListener = listener; } } private void createDefaultListener() { mRegistrationListener = new NsdManager.RegistrationListener() { @Override public void onRegistrationFailed(NsdServiceInfo serviceInfo, int errorCode) { Log.i(TAG, "onRegistrationFailed,errCode = " + errorCode); } @Override public void onUnregistrationFailed(NsdServiceInfo serviceInfo, int errorCode) { Log.i(TAG, "onUnregistrationFailed,errCode = " + errorCode); } @Override public void onServiceRegistered(NsdServiceInfo serviceInfo) { Log.i(TAG, "onServiceRegistered,serviceInfo=" + serviceInfo.toString()); } @Override public void onServiceUnregistered(NsdServiceInfo serviceInfo) { Log.i(TAG, "onServiceUnregistered,serviceInfo=" + serviceInfo.toString()); } }; } /** * 开始设备发现服务 */ public void startDiscoveryService(NsdManager.DiscoveryListener discoveryListener, NsdManager.ResolveListener resolveListener) { initDiscoveryListener(discoveryListener); mNsdManager.discoverServices(Constants.NSD_SERVER_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener); } /** * 停止设备发现服务 */ public void stopDiscoveryService() { mNsdManager.stopServiceDiscovery(mDiscoveryListener); } private void initDiscoveryListener(NsdManager.DiscoveryListener discoveryListener) { if (discoveryListener == null) { createDefaultDiscoveryListener(); } else { mDiscoveryListener = discoveryListener; } } private void createDefaultDiscoveryListener() { mDiscoveryListener = new NsdManager.DiscoveryListener() { @Override public void onStartDiscoveryFailed(String serviceType, int errorCode) { } @Override public void onStopDiscoveryFailed(String serviceType, int errorCode) { } @Override public void onDiscoveryStarted(String serviceType) { } @Override public void onDiscoveryStopped(String serviceType) { } @Override public void onServiceFound(NsdServiceInfo serviceInfo) { Log.i(TAG, "onServiceFound,serviceInfo= " + serviceInfo.toString()); if(serviceInfo.getServiceName().equalsIgnoreCase(mServiceName)){ mNsdManager.resolveService(serviceInfo, new NsdManager.ResolveListener() { @Override public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) { } @Override public void onServiceResolved(NsdServiceInfo serviceInfo) { Log.i(TAG, "onServiceResolved,serviceInfo= " + serviceInfo.toString()); } }); } } @Override public void onServiceLost(NsdServiceInfo serviceInfo) { Log.i(TAG, "onServiceLost,serviceInfo= " + serviceInfo.toString()); } }; }}
下面是打印的日志:
onServiceRegistered,serviceInfo=name: dy.com.alphad.nsd, type: null, host: null, port: 0 I/NSDHelper: onServiceFound,serviceInfo= name: dy.com.alphad.nsd, type: _http._tcp., host: null, port: 0 I/NSDHelper: onServiceResolved,serviceInfo= name: dy.com.alphad.nsd, type: ._http._tcp, host: .....165, port: 1008
可以看出来,1.自己注册的服务也可以在被自己在发现服务的时候找到
2.serviceinfo 在解析之前只能读取到名称,解析之后才能看到全部信息。
另外(发现服务)和(向外广播自己的服务)据说比较耗电,记得开启INTENET权限。
更多相关文章
- 在子线程中更新UI(后台服务)
- android监测本地服务
- NanoHTTPD 服务
- Android访问https服务
- 壁纸服务的启动过程
- Android7.0修改时间服务器
- Android在Service服务中调用Activity活动的方法,实现UI界面更新操
- 关于Android(安卓)Genymotion 运行DDMS报ADB server didn't ACK
- Android(安卓)系列 4.6在显示其他应用程序的同时运行后台服务