无法从Android连接到iMac上托管的bonjour服务

| 我的目标是找到WIFI网络中的所有bonjour服务,找到其ip /端口,并通过HTTP进行通信。 在iMac上托管的Bonjour服务被错误地发现-找到服务名称,但端口= 0,InetAddress [] = null。 与Windows PC上托管的相同服务的连接正常工作(一个供应商提供的相同版本的软件)-正确发现了名称,URL和端口。 Bonjour服务浏览器可以正确看到这两个服务。 使用了JmDNS 3.4.0 lib,请参见代码示例(省略了一些代码):
MulticastLock lock = wifi.createMulticastLock(MULTICAST_LOCK_TAG);
lock.setReferenceCounted(true);
lock.acquire();

final InetAddress inetAddress = getLocalIpAddress();
jmdns = JmDNS.create(inetAddress, JMDNS_NAME);

ServiceInfo[] infos = jmdns.list(CAMERA_SERVERS);

if (infos != null && infos.length > 0) {
    for (int i = 0; i < infos.length; i++) {
        name = infos[i].getName();
        InetAddress[] addresses = infos[i].getInetAddresses();
        url = addresses[0].getHostAddress();
        port = infos[i].getPort();
    }
PS。从Apple尝试过dns_sd.jar,但它依赖于本机代码,因此不能在Android中使用。 有任何想法吗? 谢谢。     
已邀请:
使用以下代码。经过测试和实施,工作正常
android.net.wifi.WifiManager.MulticastLock lock;
    android.os.Handler handler = new android.os.Handler();

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

            handler.postDelayed(new Runnable() {
                public void run() {
                    setUp1();
                }
            }, 1000);

        } 

      private void setUp1() 
        {
            android.net.wifi.WifiManager wifi = (android.net.wifi.WifiManager) getSystemService(android.content.Context.WIFI_SERVICE);
            lock = wifi.createMulticastLock(\"mylockthereturn\");
            lock.setReferenceCounted(true);
            lock.acquire();

            try {
                //http://stackoverflow.com/questions/13677199/jmdns-doesnt-work-properly-on-android-4-1 


                WifiInfo wifiInfo = wifi.getConnectionInfo();
                int ip = wifiInfo.getIpAddress();
                String ipAddress = Formatter.formatIpAddress(ip);

                InetAddress _bindingAddress = InetAddress.getByName(ipAddress);
                jmdns = JmDNS.create(_bindingAddress);

                ServiceInfo[] infos = jmdns.list(\"_afpovertcp._tcp.local.\");
                for (int i=0; i < infos.length; i++) {
                    notifyUser(\"\\nServic : \"+infos[i].getName()+\"\");

                }
                System.out.println();


            } catch (IOException e) {
                e.printStackTrace();
            }

        }

private void notifyUser(final String msg) {
        handler.postDelayed(new Runnable() {
            public void run() {

                TextView t = (TextView)findViewById(R.id.text);
                t.setText(msg+\"\\n=== \"+t.getText());
            }
        }, 1);

    }
    
对于初学者,请尝试使用不带参数的
JmDNS.create
方法重载。问题是可能存在多个网络接口(移动和wifi),并且您可能会使用
getLocalIpAddress
绑定到错误的IP。在此处阅读有关JmDNS如何猜测这些参数的更多信息。之所以可以在PC上运行,是因为您的
getLocalIpAddress
返回了WiFi ip。也许是因为它是唯一的网络接口。 另外,请确保要访问的服务可通过WiFi使用。无线路由器出于明显的安全原因将WiFi网络和以太网分开是非常普遍的。     

要回复问题请先登录注册