Android 解析 DNS SRV 记录

问题描述

在我的应用程序中,我正在尝试解析域的 SRV DNS 记录。在我的研究中,我偶然发现了 Lightweight way to resolve DNS SRV records on Android 并发现 dnsjavaminidns 有能力做到这些。

1. dnsjava

在实施后,我发现 dnsjava 无法解析记录,并且列表始终为 null。我使用的代码是:

private void dnsjava () {
    try {
        Lookup configLookup = new Lookup(URL,Type.SRV);
        //configLookup.setResolver(new ExtendedResolver());
        Record[] records = configLookup.run();
        if ( records != null && records.length > 0 ) {
            for ( Record record : records ) {
                SRVRecord srv = (SRVRecord) record;
                String hostname = srv.getTarget().toString();
                Log.d(TAG,"Hostname: " + hostname);
            }
        } else {
            Log.e(TAG,"NO record");
        }
    } catch (Exception e) {
        e.printstacktrace();
    }
}

但这总是打印 NO record

2. minidns

通过 usnig minidns 我能够获得 SRC 记录,但是解决这个问题需要将近 2 分钟。如此漫长的等待时间几乎令人无法接受。我使用的代码是:

private void minidns () throws IOException {
    AndroidUsingLinkProperties.setup(getApplicationContext());

    SrvResolverResult res = ResolverApi.INSTANCE.resolveSrv(URL);

    if ( ! res.wasSuccessful() ) {
        Log.d(TAG,"Not successful");
    } else {
        List<SrvResolverResult.ResolvedSrvRecord> srvRecords = res.getSortedSrvResolvedAddresses();
        for ( SrvResolverResult.ResolvedSrvRecord srvRecord : srvRecords ) {
            Log.d(TAG,"Hostname: " + srvRecord.aRecordsResult.getQuestion().name.toString());
            for ( InternetAddressRR inetAddressRR : srvRecord.addresses ) {
                InetAddress inetAddress = inetAddressRR.getInetAddress();
                Log.d(TAG,"IP: " + inetAddress.getHostName());
            }
        }
    }
}

此处 ResolverApi.INSTANCE.resolveSrv(URL) 需要几秒钟才能返回结果,而 res.getSortedSrvResolvedAddresses() 需要将近 2 分钟才能返回。

所以,我的问题是:

  1. 有没有办法优化 minidns 的实现?
  2. 如何使 dnsjava 工作?我正在最新版本的 Android 上测试它。有一些 issues 从 Android O 开始,但不确定如何解决这个问题。
  3. 还有其他方法可以在 Android 上解析 SRV 记录吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)