0

У меня есть сервер с сертификатом SSL.
И я использую функции uploadFileHttps (...) для загрузки изображения и получения соответствующего ответа с помощью HttpsUrlConnection.
Для части загрузки она отправляет данные изображения через выходной поток.
Однако сервер не получил это изображение.
Кроме того, когда он пытается получить ответ от сервера через входной поток. Он ловит исключение «java.net.SocketTimeoutException: Read timed out»
Как я могу его исправить?Android: используйте HttpsUrlConnection для загрузки и получения ответа, но получил SocketTimeoutException

private static final int CONNECTION_TIMEOUT = 20000; 
private static final int IMAGE_UPLOAD_TIMEOUT = 60000; 

private void uploadFileHttps(File file, String requestURL) { 
    HttpsURLConnection connection = null; 
    try { 

     //requestURL is a https link like: https://test.abcde.com/upload 
     connection = (HttpsURLConnection) new URL(requestURL).openConnection(); 

     connection.setHostnameVerifier(new NullHostNameVerifier()); 

     connection.setConnectTimeout(CONNECTION_TIMEOUT);//timeout for handshake 
     connection.setReadTimeout(IMAGE_UPLOAD_TIMEOUT);//timeout for waiting read data 
     connection.setRequestMethod("PUT"); 
     connection.setRequestProperty("Content-Type", "image/jpeg"); 
     Token.setAuthTokenHeader(connection, context); 

     connection.setDoOutput(true);//set to use httpURLConnection for output 
     connection.connect(); 

     //upload file to server 
     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) { 
      // write output 
      out.write(buf, 0, bytesRead); 
      out.flush(); 
     } 
     out.flush(); 
     out.close(); 

     //get response from server 
     BufferedReader br = new BufferedReader(new InputStreamReader((connection.getInputStream()))); 
     StringBuilder sb = new StringBuilder(); 
     String output; 
     while ((output = br.readLine()) != null) { 
      sb.append(output); 
     } 
     System.out.println(sb.toString()); 
    } catch (Exception e) { 
     if (e != null) 
      e.printStackTrace(); 
    } finally { 
     if (connection != null) connection.disconnect(); 
    } 
} 

class NullHostNameVerifier implements HostnameVerifier { 

    @Override 
    public boolean verify(String hostname, SSLSession session) { 
     Log.i("RestUtilImpl", "Approving certificate for " + hostname); 
     return true; 
    } 

} 

Трассировка стека для ошибки

W/System.err﹕ java.net.SocketTimeoutException: Read timed out 
W/System.err﹕ at com.android.org.conscrypt.NativeCrypto.SSL_read(Native Method) 
W/System.err﹕ at com.android.org.conscrypt.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketImpl.java:689) 
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:308) 
W/System.err﹕ at com.android.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:135) 
W/System.err﹕ at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:644) 
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.android.okhttp.internal.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:246) 
W/System.err﹕ at com.seasonworkstation.testhttps.network.HttpRequestTask.uploadFileSSL(HttpRequestTask.java:355) 
W/System.err﹕ at com.seasonworkstation.testhttps.network.HttpRequestTask.doRequest(HttpRequestTask.java:152) 
W/System.err﹕ at com.seasonworkstation.testhttps.network.HttpRequestTask.doInBackground(HttpRequestTask.java:182) 
W/System.err﹕ at com.seasonworkstation.testhttps.network.HttpRequestTask.doInBackground(HttpRequestTask.java:47) 
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 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) 
+0

Та же проблема http://stackoverflow.com/questions/15608499/getting-java-net-sockettimeoutexception-connection-timed-out-in-android –

+1

@gabber нет, это не та же проблема, что и исключение - это чтение Время вышло. – Season

+0

Попробуйте поставить 'connection.connect();' между частью «загрузить файл на сервер» и «получить ответ от сервера». – BNK

ответ

0
connection.setRequestMethod("PUT"); 

Это устанавливает метод запроса к PUT.

connection.setDoOutput(true);//set to use httpURLConnection for output 

Это устанавливает метод запроса к POST. Вам необходимо выполнить это доPUT.

+0

Вы хотите переключить эти 2 строки? Я сделал это, но не повезло. – Season

 Смежные вопросы

  • Нет связанных вопросов^_^