2017-02-24 58 views
0

大家欢乐周五!Android:当网络连接发生变化时,DNS Java SRV查找失败

我的Android应用程序依靠DNS Java(http://www.dnsjava.org/doc/)执行SRV查找。我们刚刚发现,如果网络连接发生变化(从LTE切换到WiFi或反之亦然),则从此以后的每次查找都会永久超时,无论新网络上是否再次建立互联网连接。有时候,这可以通过切换回旧网络来解决,但如果更改次数过多,则无法恢复。以下是我们在下面使用的代码。

如果我可以提供任何其他细节,请让我知道。非常感谢帮助!

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; 
    } 

回答

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(); 
     } 
+0

谢谢!它适用于ResolverConfig.refresh(); 我的代码连接发生了变化:org.xbill.DNS.ResolverConfig.refresh(); lookup.setResolver(new ExtendedResolver()); –