5

Używam HttpURLConnection, aby przesłać obraz i uzyskać jego odpowiedź.
Działa na emulatorze i moim urządzeniu XiaoMi.
Jednak zawsze dostajesz SocketTimeoutException na moim urządzeniu Sony pod numerem connection.getInputStream().
Próbowałem ustawić limity czasu na dużą wartość, np. 1 minutę, ale nie działało.
HttpURLConnection.getInputStream() wyrzuca 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; 
    } 

Co powoduje ten problem i jak go naprawić?

Dodatkowe informacje: Przetestowałem na urządzeniach pod tym samym łączem Wi-Fi. I pewnie serwer sieciowy i plikowy działał poprawnie. Rozmiar testowanych obrazów wynosi około 100 ~ 200kbajtów.

+0

Czy wyjątek SocketTimeoutException występuje natychmiast po skonfigurowanym limicie czasu? – Robert

+0

Wyjątek @Robert występuje po upływie limitu czasu – Season

+0

Nie należy przepłukiwać wewnętrznych pętli. – EJP

Odpowiedz

0

Ponieważ ustawiono limit czasu odczytu na dziesięć sekund i w ciągu dziesięciu sekund nie otrzymano żadnej odpowiedzi.

Czy to podchwytliwe pytanie?

NB Nie trzeba ustawiać nagłówka długości treści. Java zrobi to za Ciebie.

+1

Wiem, że wystąpił wyjątek ze względu na długi czas odczytu. Ale dlaczego jedno z moich urządzeń nie działa, a inne urządzenie/emulator działa? używają tego samego połączenia Wi-Fi. – Season

+0

dziesięć sekund nie jest niską wartością –

+0

@MicheleBontorno Nie mogę się z tym zgodzić. Ani ty, nie znając średniego czasu odpowiedzi serwera i jego wariancji. – EJP

0

Po prostu usuń instrukcję connection.setReadTimeout(), ponieważ domyślnie ustawi ona wartość readTiomeout na 0, to znaczy będzie czekać na dane, dopóki dane nie będą dostępne. Tak, możesz nie otrzymać wyjątku SocketTimeOut.

Powiązane problemy