首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android NSD未发现所有服务

Android NSD未发现所有服务
EN

Stack Overflow用户
提问于 2012-10-09 20:03:40
回答 6查看 8K关注 0票数 31

我正在尝试使用Android Native Service Discovery运行一个应用程序,但有时当我运行该应用程序时,它无法发现我网络中的所有服务。我使用四个galaxy nexus运行来自https://github.com/joeluchoa/nsd的代码,大多数时候,它们中的每一个都会同时发现不同数量的服务。

基本上,我使用ServerSocket运行服务:

代码语言:javascript
复制
ServerSocket server = new ServerSocket(0);
Log.i(TAG, "IP " + server.getInetAddress()
        + ", running on port " + server.getLocalPort());

Intent intent = new Intent(MySocket.this,
        MyPresence.class);
intent.putExtra("PORT", server.getLocalPort());
startService(intent);

然后我使用NsdManager中的registerService方法发布它:

代码语言:javascript
复制
NsdServiceInfo serviceInfo = new NsdServiceInfo();

serviceInfo.setServiceName(Build.SERIAL + "-" + new Date().getTime());
serviceInfo.setServiceType(SERVICE_TYPE);
serviceInfo.setPort(port);

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

要发现服务,我使用NsdManager中的discoverServices方法:

代码语言:javascript
复制
mNsdManager.discoverServices(SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD,
        mDiscoveryListener);

其中mDiscoveryListener如下:

代码语言:javascript
复制
mDiscoveryListener = new NsdManager.DiscoveryListener() {

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

    @Override
    public void onServiceFound(NsdServiceInfo service) {
        Log.d(TAG, "Service discovery success");
        Log.d(TAG, String.format("%s %s %s %d",
                service.getServiceName(), service.getServiceType(),
                service.getHost(), service.getPort()));
        if (!service.getServiceType().contains(SERVICE_TYPE)) {
            Log.d(TAG,
                    "Unknown Service Type: " + service.getServiceType());
        } else if (service.getServiceName().equals(mServiceName)) {
            Log.d(TAG, "Same machine: " + mServiceName);
        } else {
            mNsdManager.resolveService(service, mResolveListener);
        }
    }

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

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

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

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

我做错了什么吗?有没有人知道这个问题的解决方案或变通方法?

EN

回答 6

Stack Overflow用户

发布于 2018-12-05 18:56:09

要发现连接的网络的所有服务,只需更改您正在发现的服务类型,

代码语言:javascript
复制
public static final String SERVICE_TYPE = "_services._dns-sd._udp";
票数 8
EN

Stack Overflow用户

发布于 2015-12-27 23:50:22

我担心在实现中仍然存在一些bug,导致它错过了服务。我用多台安卓设备和一台MacBook做了几天的测试,但并不是一直都能用。我在Android bug tracker中记录了我在bug报告中的发现:https://code.google.com/p/android/issues/detail?id=178080

票数 1
EN

Stack Overflow用户

发布于 2016-11-02 18:57:36

我倾向于认为整个NSD在Android中的实现一定有点古怪。我还有一个简单的活动,只是为了演示生命周期(没有打开任何套接字),它有时工作,有时不工作。我就是不明白。如果任何人有一些洞察力,这里是活动:

https://github.com/mholzel/Dump/blob/master/NetworkServiceDiscoveryViaWifi.java

另一方面,基于Wifi Direct的NSD对我来说似乎非常可靠:

https://github.com/mholzel/Dump/blob/master/NetworkServiceDiscoveryViaWifiDirect.java

请注意,这两个活动都没有任何资源,因此只需使用适当的权限将这些活动添加到您的清单中即可。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12799615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档