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权限。


更多相关文章

  1. 在子线程中更新UI(后台服务)
  2. android监测本地服务
  3. NanoHTTPD 服务
  4. Android访问https服务
  5. 壁纸服务的启动过程
  6. Android7.0修改时间服务器
  7. Android在Service服务中调用Activity活动的方法,实现UI界面更新操
  8. 关于Android(安卓)Genymotion 运行DDMS报ADB server didn't ACK
  9. Android(安卓)系列 4.6在显示其他应用程序的同时运行后台服务

随机推荐

  1. Android(安卓)和jsp登录接口
  2. android开机动画启动流程
  3. Gradle(三)构建任务
  4. Android电源管理机制分析(zz)
  5. Android DialogFragment(1)
  6. Android achartengine统计图
  7. 创建适配器时报:ERROR/AndroidRuntime(17
  8. 我的Android学习笔记1(Android开发环境配
  9. 收集几个移动平台浏览器的User-Agent
  10. 从零开始学android开发-通过WebService获