首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android无法注意到JmDNS服务

Android无法注意到JmDNS服务
EN

Stack Overflow用户
提问于 2012-03-27 23:31:47
回答 1查看 1.4K关注 0票数 1

我很难让JmDNS和我的Android一起工作。我已经创建了3个应用程序。注册ServiceListener并记录任何活动的Android应用程序、与android应用程序相同的Java应用程序和注册服务的另一个Java应用程序。Java侦听器应用程序将接收到另一个Java应用程序,而android应用程序则不会。我还试着同时运行两个AVD,看看他们是否会互相了解,但他们不会。我还应该提到,我对互联网和CHANGE_WIFI_MULSTICAST_STATE都有权限。这是我的密码:

安卓应用程序:

代码语言:javascript
复制
public class BonjourActivity extends Activity {

    // Multicast
    private WifiManager wifi;
    private MulticastLock lock;
    private JmDNS jmdns;
    private String type = "_im._tcp.local.";
    private ServiceListener listener;
    private ServiceInfo serviceInfo;

    // On Create
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Multicast
        wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        lock = wifi.createMulticastLock("");
        lock.setReferenceCounted(true);
        lock.acquire();

        // JmDNS
        new AsyncTask<Object, Object, Object>(){
            @Override
            protected Object doInBackground(Object... params) {
                // Create JmDNS
                try {
                    jmdns = JmDNS.create();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                return null;
            }
             protected void onPostExecute(Object result) {
                 // Add Listener
                 jmdns.addServiceListener(type, listener = new ServiceListener(){
                        @Override
                        public void serviceAdded(ServiceEvent ev) {
                            jmdns.requestServiceInfo(ev.getType(), ev.getName(), 1);
                        }
                        @Override
                        public void serviceRemoved(ServiceEvent ev) {
                            Log.d("Service", "Service Removed: " + ev.getName());
                        }
                        @Override
                        public void serviceResolved(ServiceEvent ev) {
                            Log.d("Service", "Service Resolved: " + ev.getInfo().getURL());
                        }
                    });
             }
        }.execute(); 
    }

    // On Destroy
    public void onDestroy(){
        // Release Lock
        if (lock != null){
            lock.release();
        }
        // Close JmDNS
        if (jmdns != null){
            jmdns.removeServiceListener(type, listener);
            try {
                jmdns.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        super.onDestroy();
    }
}

Java侦听器应用程序:

代码语言:javascript
复制
public class Listener {

    private static JmDNS jmdns;
    private static String type = "_im._tcp.local.";
    private static ServiceListener serviceListener;
    private static ServiceInfo serviceInfo;

    // Main
    public static void main(String args[]){

        try {
            jmdns = JmDNS.create();
            jmdns.addServiceListener(type, serviceListener = new ServiceListener(){
                @Override
                public void serviceAdded(ServiceEvent ev) {
                    System.out.println("Service Added: " + ev.getName());
                    jmdns.requestServiceInfo(ev.getType(), ev.getName(), 1);
                }
                @Override
                public void serviceRemoved(ServiceEvent ev) {
                    System.out.println("Service Removed: " + ev.getName());
                }
                @Override
                public void serviceResolved(ServiceEvent ev) {
                    System.out.println("Service Resolved: " + ev.getInfo().getURL());
                }
            });
            System.out.println("Listener Added");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

Java发件人应用程序:

代码语言:javascript
复制
public class Sender {

    private static JmDNS jmdns;
    private static String type = "_im._tcp.local.";
    private static ServiceListener serviceListener;
    private static ServiceInfo serviceInfo;

    // Main
    public static void main(String args[]){

        try {
            jmdns = JmDNS.create();
            serviceInfo = ServiceInfo.create(type, "Test IM Service", 55555, "Instant messaging test service");
            jmdns.registerService(serviceInfo);
            System.out.println("Sender: Service Created");
            new Timer().schedule(new TimerTask(){
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    System.out.println("Closing..");
                    jmdns.unregisterAllServices();
                    try {
                        jmdns.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.exit(0);
                }
            }, 10000);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

此外,当我尝试运行应用程序时,LogCat会给出一些错误:

NetworkManagementSocketTagger setKernelCountSet(10009,0)与errno -2失败

WifiStateMachine错误!未处理消息{ what=131157时=-1ms }

有没有人知道为什么安卓应用程序无法获取其他应用程序生成的JmDNS服务?

EN

回答 1

Stack Overflow用户

发布于 2012-06-22 09:41:06

请注意,在模拟器中运行的虚拟设备与计算机不在同一网络中。服务发现可能不起作用。我的jmdns实现在模拟器中不起作用。在真正的设备上试一试。并访问http://home.heeere.com/tech-androidjmdns.html获取更多详细信息。

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

https://stackoverflow.com/questions/9899177

复制
相关文章

相似问题

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