2

我最近开始研究 Android 提供的网络服务发现。

我在同一个网络上连接了两个应用程序。将使用此类注册服务:

public class NsdRegister {

private Context                             mContext;

private NsdManager                          mNsdManager;
private NsdManager.RegistrationListener     mRegistrationListener;

public String                               mServiceName = "NsdServer1";
public static final String                  SERVICE_TYPE = "_http._tcp.";

public NsdHelper(Context context) {
    mContext = context;
    mNsdManager = (NsdManager) context.getSystemService(Context.NSD_SERVICE);
}


public void initializeRegistrationListener() {
    mRegistrationListener = new NsdManager.RegistrationListener() {

        @Override
        public void onServiceRegistered(NsdServiceInfo NsdServiceInfo) {
            mServiceName = NsdServiceInfo.getServiceName();
            System.out.println(mServiceName);
        }

        @Override
        public void onRegistrationFailed(NsdServiceInfo arg0, int arg1) {
            System.out.println(arg0.toString());
            System.out.println("Failed " + arg1);
        }

        @Override
        public void onServiceUnregistered(NsdServiceInfo arg0) {
        }

        @Override
        public void onUnregistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
        }
    };
}

public void registerService() {
    initializeRegistrationListener();
    NsdServiceInfo serviceInfo  = new NsdServiceInfo();
    serviceInfo.setPort(5906);
    serviceInfo.setServiceName(mServiceName);
    serviceInfo.setServiceType(SERVICE_TYPE);
    mNsdManager.registerService(serviceInfo, NsdManager.PROTOCOL_DNS_SD, mRegistrationListener);
}

public void tearDown() {
    mNsdManager.unregisterService(mRegistrationListener);
}
}

另一个应用程序将使用此类发现网络上的所有服务:

public class NsdHelper {

public static final String                  SERVICE_TYPE = "_http._tcp.";
public static final String                  TAG = "NsdHelper";
public static final String                  SERVER_AIO = "NsdServer1";

private Context                             mContext;

private NsdManager                          mNsdManager;
private NsdManager.DiscoveryListener        mDiscoveryListener;

private NsdServiceInfo                      mService;

public NsdHelper(Context context) {
    mContext = context;
    mNsdManager = (NsdManager) context.getSystemService(Context.NSD_SERVICE);
}

private void initializeDiscoveryListener() {
    mDiscoveryListener = new NsdManager.DiscoveryListener() {

        @Override
        public void onDiscoveryStarted(String regType) {
            Log.d(TAG, "Service discovery started");
        }

        @Override
        public void onServiceFound(NsdServiceInfo service) {
            if (service.getServiceName().equals(SERVER_AIO)) {
                mNsdManager.resolveService(service, new NsdManager.ResolveListener() {
                    @Override
                    public void onResolveFailed(NsdServiceInfo nsdServiceInfo, int i) {
                        System.out.println("Failed to resolve");
                    }

                    @Override
                    public void onServiceResolved(NsdServiceInfo nsdServiceInfo) {
                        stopDiscovery();
                        System.out.println(nsdServiceInfo.getHost().getHostAddress());
                    }
                });
            }
        }

        @Override
        public void onServiceLost(NsdServiceInfo service) {
            Log.e(TAG, "service lost" + service);
            if (mService == service) {
                mService = null;
            }
        }

        @Override
        public void onDiscoveryStopped(String serviceType) {
            Log.i(TAG, "Discovery stopped: " + serviceType);
        }

        @Override
        public void onStartDiscoveryFailed(String serviceType, int errorCode) {
            Log.e(TAG, "Discovery failed: Error code:" + errorCode);
            mNsdManager.stopServiceDiscovery(this);
        }

        @Override
        public void onStopDiscoveryFailed(String serviceType, int errorCode) {
            Log.e(TAG, "Discovery failed: Error code:" + errorCode);
            mNsdManager.stopServiceDiscovery(this);
        }
    };
}

public void discoverServices() {
    initializeDiscoveryListener();
    mNsdManager.discoverServices(SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener);
}

public void stopDiscovery() {
    mNsdManager.stopServiceDiscovery(mDiscoveryListener);
}
}

注册顺利,但发现没有找到我的服务。我为这两个应用程序连接在同一个网络上。

我不知道问题出在哪里。

请帮我,

谢谢

4

1 回答 1

0

这对我来说非常有效。

客户

public class ClientActivity extends Activity {

private String SERVICE_NAME = "Client Device";
private String SERVICE_TYPE = "_http._tcp.";

private InetAddress hostAddress;
private int hostPort;
private NsdManager mNsdManager;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // set content view and other stuff

    // NSD Stuff
    mNsdManager = (NsdManager) getSystemService(ClientActivity.NSD_SERVICE);
    mNsdManager.discoverServices(SERVICE_TYPE,
            NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener);
}

@Override
protected void onPause() {
    if (mNsdManager != null) {
        mNsdManager.stopServiceDiscovery(mDiscoveryListener);
    }
    super.onPause();
}

@Override
protected void onResume() {
    super.onResume();
    if (mNsdManager != null) {
        mNsdManager.discoverServices(
                SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener);
    }

}

@Override
protected void onDestroy() {
    if (mNsdManager != null) {
        mNsdManager.stopServiceDiscovery(mDiscoveryListener);
    }
    super.onDestroy();
}


NsdManager.DiscoveryListener mDiscoveryListener = new NsdManager.DiscoveryListener() {

    // Called as soon as service discovery begins.
    @Override
    public void onDiscoveryStarted(String regType) {
        System.out.println("Listening Service discovery started");
    }

    @Override
    public void onServiceFound(NsdServiceInfo service) {
        // A service was found! Do something with it.
        System.out.println("Listening Service discovery success : " + service);
        System.out.println("Listening Host = "+ service.getServiceName());
        System.out.println("Listening port = " + String.valueOf(service.getPort()));

        if (!service.getServiceType().equals(SERVICE_TYPE)) {
            // Service type is the string containing the protocol and
            // transport layer for this service.
            System.out.println("Listening Unknown Service Type: " + service.getServiceType());
        } else if (service.getServiceName().equals(SERVICE_NAME)) {
            // The name of the service tells the user what they'd be
            // connecting to. It could be "Bob's Chat App".
            System.out.println("Listening Same machine: " + SERVICE_NAME);
        } else {
            System.out.println("Listening Diff Machine : " + service.getServiceName());
            // connect to the service and obtain serviceInfo
            mNsdManager.resolveService(service, mResolveListener);
        }
    }

    @Override
    public void onServiceLost(NsdServiceInfo service) {
        // When the network service is no longer available.
        // Internal bookkeeping code goes here.
        System.out.println("Listening service lost" + service);
    }

    @Override
    public void onDiscoveryStopped(String serviceType) {
        System.out.println("Listening Discovery stopped: " + serviceType);
    }

    @Override
    public void onStartDiscoveryFailed(String serviceType, int errorCode) {
        System.out.println("Listening failed: Error code:" + errorCode);
        mNsdManager.stopServiceDiscovery(this);
    }

    @Override
    public void onStopDiscoveryFailed(String serviceType, int errorCode) {
        System.out.println("Listening failed: Error code:" + errorCode);
        mNsdManager.stopServiceDiscovery(this);
    }
};

NsdManager.ResolveListener mResolveListener = new NsdManager.ResolveListener() {

    @Override
    public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) {
        // Called when the resolve fails. Use the error code to debug.
        System.out.println("Listening  Resolve failed " + errorCode);
        System.out.println("Listening serivce = " + serviceInfo);
    }

    @Override
    public void onServiceResolved(NsdServiceInfo serviceInfo) {
        System.out.println("Listening . " + serviceInfo.getServiceName());

        if (serviceInfo.getServiceName().equals(SERVICE_NAME)) {
            System.out.println("Listening port " + serviceInfo);
            return;
        }

        // Obtain port and IP

        hostPort = serviceInfo.getPort();
        hostAddress = serviceInfo.getHost();
        System.out.println("Listening port " + hostPort);
        System.out.println("Listening ip " + hostAddress);
    }
};

服务器

public class ServerActivity extends Activity {

private String SERVICE_NAME = "Server device";
private String SERVICE_TYPE = "_http._tcp.";
private NsdManager mNsdManager;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // setContentView and other stuff

    mNsdManager = (NsdManager) getSystemService(ServerActivity.NSD_SERVICE);
    registerService(9000);
}

@Override
protected void onPause() {
    if (mNsdManager != null) {
        mNsdManager.unregisterService(mRegistrationListener);
    }
    super.onPause();
}

@Override
protected void onResume() {
    super.onResume();
    if (mNsdManager != null) {
        registerService(9000);
    }

}

@Override
protected void onDestroy() {
    if (mNsdManager != null) {
        mNsdManager.unregisterService(mRegistrationListener);
    }
    super.onDestroy();
}

public void registerService(int port) {
    NsdServiceInfo serviceInfo = new NsdServiceInfo();
    serviceInfo.setServiceName(SERVICE_NAME);
    serviceInfo.setServiceType(SERVICE_TYPE);
    serviceInfo.setPort(port);

    mNsdManager.registerService(serviceInfo,
            NsdManager.PROTOCOL_DNS_SD,
            mRegistrationListener);
}

NsdManager.RegistrationListener mRegistrationListener = new NsdManager.RegistrationListener() {

    @Override
    public void onServiceRegistered(NsdServiceInfo NsdServiceInfo) {
        String mServiceName = NsdServiceInfo.getServiceName();
        SERVICE_NAME = mServiceName;
        System.out.println("Listening Registered name : " + mServiceName);
    }

    @Override
    public void onRegistrationFailed(NsdServiceInfo serviceInfo,
                                     int errorCode) {
        System.out.println("Listening Registered failed : " + errorCode);
    }

    @Override
    public void onServiceUnregistered(NsdServiceInfo serviceInfo) {
        // Service has been unregistered. This only happens when you
        // call
        // NsdManager.unregisterService() and pass in this listener.
        System.out.println("Listening Service Unregistered : " + serviceInfo.getServiceName());
    }

    @Override
    public void onUnregistrationFailed(NsdServiceInfo serviceInfo,
                                       int errorCode) {
        // Unregistration failed. Put debugging code here to determine
        // why.
        System.out.println("Listening Unregistration failed : " + errorCode);
    }
};
于 2018-01-16T12:15:10.423 回答