Android AVD 无法通知 JmDNS 服务

标签 android service bonjour android-virtual-device jmdns

我在让 JmDNS 与我的 Android AVD 一起工作时遇到了一些困难。我创建了 3 个应用程序。一个注册 ServiceListener 并记录任何 Activity 的 Android 应用程序,一个与 android 应用程序执行相同操作的 Java 应用程序,以及另一个注册服务的 Java 应用程序。 Java 监听器应用程序将接收其他 Java 应用程序,但 android 应用程序不会。我也试过同时运行两个 AVD,看看它们是否会互相接收,但它们不会。我还应该提到我拥有 INTERNET 和 CHANGE_WIFI_MULSTICAST_STATE 启用权限。这是我的代码:

安卓应用:

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 监听器应用程序:

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 发送器应用程序:

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 when=-1ms }

可能有人知道为什么 android 应用程序无法获取其他应用程序生成的 JmDNS 服务吗?

最佳答案

请注意,模拟器中运行的虚拟设备与计算机不在同一网络中。服务发现可能不起作用。我的 jmdns 实现在模拟器中不起作用。在真实设备上试用。 然后转到 http://home.heeere.com/tech-androidjmdns.html了解更多详情。

关于Android AVD 无法通知 JmDNS 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9899177/

相关文章:

iphone - Bonjour 通过蓝牙无需 Gamekit ?

android - ViewModelProviders.of(getActivity()) "Cannot resolve method of(android.app.Activity)"

android - 程序类型已经存在 : com. google.android.gms.common.api.zzf

互联网上的 iOS Bonjour

c# - 如何获取当前登录用户的 session ID?

java - Android如何在应用程序停止时保留 native 库

ios - 如何在iOS swift中获取AVAHI发布的服务的IP和PORT?

android - 设置 android :layout_column = "1" 时 TableLayout 不跳过第 0 列

Android 图片缩放动画

android - APK 更新终止前台服务 - 报告为崩溃