5

Sto utilizzando HttpURLConnection per caricare un'immagine e ottenere la sua risposta.
Funziona sull'emulatore e sul mio dispositivo XiaoMi.
Tuttavia, viene sempre visualizzato un numero SocketTimeoutException sul mio dispositivo Sony sulla linea connection.getInputStream().
Ho provato a impostare i timeout su un valore elevato come 1 minuto ma non funziona.
HttpURLConnection.getInputStream() genera SocketTimeoutException

public String uploadFile(File file, String requestURL) { 

     if (file != null) { 
      long fileSize = file.length(); 
      HttpURLConnection.setFollowRedirects(false); 
      HttpURLConnection connection = null; 
      try { 
       //config of connection 
       connection = (HttpURLConnection) new URL(requestURL).openConnection(); 
       connection.setConnectTimeout(10000); 
       connection.setReadTimeout(10000); 
       connection.setRequestMethod("PUT"); 
       connection.setRequestProperty("Content-Type", "image/jpeg"); 
       connection.setDoOutput(true); 
       connection.setRequestProperty("Content-length", "" + fileSize); 
       connection.connect(); 

       //upload file 
       DataOutputStream out = new DataOutputStream(connection.getOutputStream()); 
       int bytesRead; 
       byte buf[] = new byte[1024]; 
       BufferedInputStream bufInput = new BufferedInputStream(new FileInputStream(file)); 
       while ((bytesRead = bufInput.read(buf)) != -1) { 
        out.write(buf, 0, bytesRead); 
        out.flush(); 
       } 
       out.flush(); 
       out.close(); 

       //get response message, but SocketTimeoutException occurs here 
       BufferedReader br = new BufferedReader(new InputStreamReader((connection.getInputStream()))); 
       StringBuilder sb = new StringBuilder(); 
       String output; 
       while ((output = br.readLine()) != null) { 
        sb.append(output); 
       } 

       //return response message 
       return output; 

      } catch (Exception e) { 
       // Exception 
       e.printStackTrace(); 
      } finally { 
       if (connection != null) connection.disconnect(); 
      } 
     } 

     return null; 
    } 

Quali sono le cause di questo problema accade? E come risolvere il problema?

Ulteriori informazioni: Ho provato su dispositivi con la stessa connessione wifi. E la rete e il file server funzionavano correttamente. La dimensione del file delle immagini testate è di circa 100 ~ 200kbyte.

+0

La SocketTimeoutException si verifica immediatamente o dopo il timeout configurato? – Robert

+0

L'eccezione @Robert si verifica dopo il timeout – Season

+0

Non svuotare i loop interni. – EJP

risposta

0

Perché si imposta un timeout di lettura di dieci secondi e nessuna risposta è stata ricevuta entro dieci secondi.

Questa è una domanda trabocchetto?

NB Non è necessario impostare l'intestazione della lunghezza del contenuto. Java lo farà per te.

+1

So che l'eccezione si verifica a causa del lungo tempo di lettura. Ma perché uno dei miei dispositivi non funziona, mentre un altro dispositivo/emulatore funziona? stanno usando la stessa connessione wifi. – Season

+0

dieci secondi non sono un valore basso –

+0

@MicheleBontorno Non posso essere d'accordo. Né puoi, senza conoscere il tempo medio di risposta del server e la sua varianza. – EJP

0

Basta rimuovere l'istruzione connection.setReadTimeout() perché di default imposterà il valore readTiomeout a 0 i.e aspetterà i dati finché i dati non saranno disponibili.so, potresti non ricevere SocketTimeOut Exception.