【问题标题】:Android: DNS Java SRV lookup fails when network connectivity changesAndroid:当网络连接发生变化时,DNS Java SRV 查找失败
【发布时间】:2017-02-28 03:14:44
【问题描述】:

祝大家周五快乐!

我的 Android 应用依赖 DNS Java (http://www.dnsjava.org/doc/) 来执行 SRV 查找。我们刚刚发现,如果网络连接发生变化(从 LTE 切换到 WiFi,反之亦然),从那时起的每次查找都将永远超时,无论是否在新网络上再次建立了 Internet 连接。有时这可以通过切换回旧网络来解决,但如果您更改太多次,它将无法恢复。这是我们在下面使用的代码。

如果我可以提供任何其他详细信息,请告诉我。非常感谢您的帮助!

private static class ConfigUpdater extends AsyncTask<Void, Void, JsonConfig> {
    private static final String SRV_RUE_CONFIG_PREFIX = "_rueconfig._tls.";
    ConfigListener listener;
    String request_url;
    String query_url;
    String username, password;
    String errorMsg;

    public ConfigUpdater(String url, String username, String password, ConfigListener listener) {
        this.username = username;
        this.password = password;
        this.listener = listener;
        query_url = SRV_RUE_CONFIG_PREFIX + url;
        errorMsg = "Failed to Login";
        org.xbill.DNS.ResolverConfig.refresh();
    }

    @Override
    protected JsonConfig doInBackground(Void... params) {
        Record[] records;// = new Record[0];
        try {
            Lookup configLookup = new Lookup(query_url, Type.SRV);
            configLookup.setCache(null);
            records = configLookup.run();
        } catch (TextParseException e) {
            e.printStackTrace();
            return null;
        }
        if(records != null && records.length > 0) {
            for (Record record : records) {
                SRVRecord srv = (SRVRecord) record;
                String hostname = srv.getTarget().toString().replaceFirst("\\.$", "");
                request_url = "https://" + hostname + "/config/v1/config.json";
                Log.d("Auto Config request_url: "+request_url);
            }

            try {
                String reponse_str = getFromHttpURLConnection();
                Log.d("Auto Config JSON: "+reponse_str);
                return parseJson(username, reponse_str, request_url);
            } catch (Throwable e){
                Log.d("Issue parsing json");
                e.printStackTrace();
            }
        }
        return null;
    }

【问题讨论】:

    标签: java android dns


    【解决方案1】:

    对于那些在网络切换后可能会遇到 SRV 查找失败的人来说,我似乎已经找到了问题所在。问题是Lookup 对象上的Resolver 属性似乎缓存了网络配置。如果您想确保您的查找始终具有最新的网络配置,只需重新初始化一个新的Resolver。通过以下修改,我无法重现任何初始测试用例。

    Record[] records = null;// = new Record[0];
            try {
                Lookup configLookup = new Lookup(query_url, Type.SRV);
                configLookup.setResolver(new ExtendedResolver()); /** FIX **/
                records = configLookup.run();
            } catch (TextParseException e) {
                e.printStackTrace();
                return null;
            } catch (UnknownHostException e) {
                e.printStackTrace();
            }
    

    【讨论】:

    • 谢谢!它适用于我 ResolverConfig.refresh();我的连接更改的代码:org.xbill.DNS.ResolverConfig.refresh(); lookup.setResolver(new ExtendedResolver());
    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多