2016-02-04 6 views
0

У меня есть код, который я использую для чтения текстового файла с URL-адреса. Однако он проявляет странное поведение. В первый раз, когда я запускаю код, я получаю сброс соединения путем одноранговой ошибки, и весь код не запускается.HttpURLConnection reset by peer при первом запуске ... работает на немедленном повторении

Если я затем повторно запускаю код сразу после того, как код работает нормально, файл загружается и операции выполняются по назначению. Вот код:

public static String GetMasterFileStream(String Operation) throws Exception { 
    System.setProperty("http.keepAlive", "false"); 
    StringBuilder sb = new StringBuilder(); 
    BufferedWriter bw = null; 
    String inputLine = null; 
    System.out.println("Server manifest checks starting"); 

    URL url = new URL(CrewAdviceMasterControlURL); 
    HttpURLConnection con = (HttpURLConnection) url.openConnection(); 
    con.setRequestProperty("connection", "close"); 

    BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); 


    File outfile = new File(LocalManifestFile); 

    String return_string = ""; 
    String [] ManifestLines; 


     switch (Operation) { 
     case "PreCheck": 
      inputLine = in.readLine(); 
      sb.append(inputLine.toString()); 
      return_string = String.valueOf(sb); 
      break; 
     case "UpdateMaster": 
     case "CreateMaster": 

      if(!outfile .exists()){ 
       outfile .createNewFile(); 
      } 
      FileWriter fileWriter = new FileWriter(outfile); 
      bw = new BufferedWriter(fileWriter); 
      int endlinecount =0; 
      while ((inputLine = in.readLine()) != null) { 
       System.out.println(inputLine); //for producing test output 
       sb.append(inputLine.toString()); 
       sb.append("\n"); 
       if (endlinecount > 0) 
       { 
        bw.write("\r\n"); 
       } 
       bw.write(String.valueOf(inputLine)); 
       endlinecount++; 
      } 
      bw.close(); 
      System.out.println("Manifest file successfully written..."); 

      return_string = String.valueOf(sb); 
      ManifestLines = return_string.split("\n"); 
      return_string = ManifestLines[0]; 
      //text = text.replace("\n", "").replace("\r", ""); 
      break; 
     } 
    in.close(); 

    return return_string; 
} 

Вот журналы ошибок:

W/System.err: java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by peer) 
D/dalvikvm: GC_FOR_ALLOC freed 6333K, 33% free 18277K/26880K, paused 50ms, total 50ms 
W/System.err:  at libcore.io.IoBridge.maybeThrowAfterRecvfrom(IoBridge.java:545) 
W/System.err:  at libcore.io.IoBridge.recvfrom(IoBridge.java:509) 
W/System.err:  at java.net.PlainSocketImpl.read(PlainSocketImpl.java:489) 
W/System.err:  at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46) 
W/System.err:  at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:241) 
W/System.err:  at java.io.InputStream.read(InputStream.java:162) 
W/System.err:  at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:142) 
W/System.err:  at java.io.BufferedInputStream.read(BufferedInputStream.java:227) 

W/System.err:  at com.android.okhttp.internal.Util.readAsciiLine(Util.java:316) 
W/System.err:  at com.android.okhttp.internal.http.RawHeaders.fromBytes(RawHeaders.java:320) 
W/System.err:  at com.android.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:147) 
W/System.err:  at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:795) 
W/System.err:  at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:347) 
W/System.err:  at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296) 
W/System.err:  at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:179) 
W/System.err:  at com.cm3.danielhutchinson.lialpatools.CrewAdviceFunctions.GetMasterFileStream(CrewAdviceFunctions.java:60) 
W/System.err:  at com.cm3.danielhutchinson.lialpatools.CrewAdviceFunctions.PreCheck(CrewAdviceFunctions.java:179) 
W/System.err:  at com.cm3.danielhutchinson.lialpatools.CrewAdviceActivity$AdviceController.doInBackground(CrewAdviceActivity.java:210) 
W/System.err:  at com.cm3.danielhutchinson.lialpatools.CrewAdviceActivity$AdviceController.doInBackground(CrewAdviceActivity.java:176) 
W/System.err:  at android.os.AsyncTask$2.call(AsyncTask.java:288) 
W/System.err:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
W/System.err:  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
W/System.err:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
W/System.err:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
W/System.err:  at java.lang.Thread.run(Thread.java:841) 
W/System.err: Caused by: libcore.io.ErrnoException: recvfrom failed: ECONNRESET (Connection reset by peer) 
W/System.err:  at libcore.io.Posix.recvfromBytes(Native Method) 
W/System.err:  at libcore.io.Posix.recvfrom(Posix.java:141) 
W/System.err:  at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:164) 
W/System.err:  at libcore.io.IoBridge.recvfrom(IoBridge.java:506) 
W/System.err: ... 23 more 
+0

'con.setRequestProperty ("соединение", "close");'. Зачем? Удалите эту строку. – greenapps

+0

'PreCheck'. Вы ничего не сказали об этом. Почему нет? Это связано? – greenapps

+0

okhttp в вашем logcat. Как это возможно с UrlConnection? – greenapps

ответ

0

я обнаружил, что при тестировании соединения сброшено сервером 50% времени с первой попытки и всегда работа по немедленной повторной попытке.

Когда я тестировал этот код раньше, этого никогда не было. Дальнейшие исследования привели меня к мысли, что это может быть сбой на стороне сервера, который не всегда присутствовал.

Я исправил проблему, поместив код внутри цикла while, связанного с «значком успеха».

Если код порождает ошибку сброса соединения, соединение возобновляется. Если это удастся, повторите попытку, и я затем поставлю счетчик повторов, который после трех попыток повтора попытается выйти из цикла и предупредить пользователя об ошибке сервера. Пока ставка успеха во 2-й попытке всегда равна 100%.