Android NSD注册服务,发现服务



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


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Android应用程序中搜索MDNS服务,可以使用Android网络框架中的Network Service Discovery(NSD)API。以下是搜索MDNS服务的一般步骤: 1. 创建NsdManager实例: ``` NsdManager nsdManager = (NsdManager) context.getSystemService(Context.NSD_SERVICE); ``` 2. 创建NsdManager.DiscoveryListener实例,并实现onDiscoveryStarted、onServiceFound、onServiceLost和onDiscoveryStopped等回调方法: ``` NsdManager.DiscoveryListener discoveryListener = new NsdManager.DiscoveryListener() { @Override public void onDiscoveryStarted(String regType) { // 发现服务 } @Override public void onServiceFound(NsdServiceInfo serviceInfo) { // 找到服务 } @Override public void onServiceLost(NsdServiceInfo serviceInfo) { // 丢失服务 } @Override public void onDiscoveryStopped(String serviceType) { // 停止搜索 } @Override public void onStartDiscoveryFailed(String serviceType, int errorCode) { // 开始搜索失败 } @Override public void onStopDiscoveryFailed(String serviceType, int errorCode) { // 停止搜索失败 } }; ``` 3. 创建NsdManager.ResolveListener实例,并实现onServiceResolved回调方法: ``` NsdManager.ResolveListener resolveListener = new NsdManager.ResolveListener() { @Override public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) { // 解析服务信息失败 } @Override public void onServiceResolved(NsdServiceInfo serviceInfo) { // 解析服务信息成功 } }; ``` 4. 开始搜索MDNS服务: ``` nsdManager.discoverServices("_http._tcp", NsdManager.PROTOCOL_DNS_SD, discoveryListener); ``` 其中,第一个参数是服务的类型,可以根据实际情况进行修改。第二个参数是协议类型,NSD API支持DNS-SD协议和mDNS协议,这里使用DNS-SD协议。第三个参数是DiscoveryListener实例。 5. 在onServiceFound回调方法中,获取到NsdServiceInfo实例,然后调用它的resolve方法解析服务信息: ``` nsdManager.resolveService(serviceInfo, resolveListener); ``` 其中,第一个参数是NsdServiceInfo实例,第二个参数是ResolveListener实例。 6. 在onServiceResolved回调方法中,获取到服务的IP地址和端口号等信息,然后可以使用它们来连接服务。 注意,搜索MDNS服务需要在AndroidManifest.xml中添加以下权限: ``` <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> ``` 同时,如果应用程序运行在Android 9.0及以上版本的设备上,则需要在AndroidManifest.xml中添加以下配置: ``` <application ... android:usesCleartextTraffic="true" ... > ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值