5

'u atar. Görüntü yüklemek ve yanıtını almak için HttpURLConnection kullanıyorum.
Bu, emülatör ve XiaoMi cihazımda çalışır.
Ancak, Sony cihazımda connection.getInputStream() hattında her zaman bir SocketTimeoutException olsun.
Zaman aşımlarını 1 dakika gibi büyük bir değere ayarlamaya çalıştım ama çalışmaz.
HttpURLConnection.getInputStream(), 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; 
    } 

Bu sorunun nedeni nedir ve nasıl düzeltilir?

Ek bilgi: Aynı wifi bağlantısı altındaki cihazlarda test yaptım. Ve emin ağ ve dosya sunucusu düzgün çalıştı. Test edilen görüntülerin dosya boyutu yaklaşık 100 ~ 200kbyte'dir.

+0

SocketTimeoutException hemen veya yapılandırılmış zaman aşımından sonra mı gerçekleşiyor? – Robert

+0

@Robert istisnası, zaman aşımından sonra oluşur – Season

+0

İç döngüleri yıkayın. – EJP

cevap

0

10 saniyelik bir okuma zaman aşımı ayarladığınızdan ve on saniye içinde yanıt alınmadığından.

Bu bir tuzak sorumısınız?

NB İçerik uzunluğu üstbilgisini ayarlamanız gerekmez. Java sizin için bunu yapacaktır.

+1

Uzun okuma süresi nedeniyle istisnanın gerçekleştiğini biliyorum. Ancak, diğer cihaz/emülatör çalışırken, cihazımdan biri neden çalışmıyor? Aynı wifi bağlantısını kullanıyorlar. – Season

+0

on saniye düşük bir değer değil –

+0

@MicheleBontorno Buna katılıyorum. Sunucunun ortalama yanıt süresini ve varyansını bilmeden de yapamazsınız. – EJP

0

Sadece connection.setReadTimeout() deyimini kaldır, çünkü varsayılan olarak readTiomeout değerini 0 olarak ayarlayacaktır, yani veri kullanılabilir olana kadar veriyi bekleyecektir.so, SocketTimeOut Exception'ı alamayabilirsiniz.

İlgili konular