2017-02-24 55 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()); –