2016-12-27 8 views
0

Я использую HttpURLConnection отправить пост запрос, но я получаю java.net.SocketTimeoutException исключение при обмене данными с сервером выше Android 5.1 (в том числе Android 5.1), но ниже андроид 5.1 запрос на пост normal.Here мой код:HttpURLConnection SocketTimeoutException на андроид 5.1, android6.0

String postMethod() throws IOException { 

    String json = JsonParser.toJson(req); 
    Log.d("dzq", "request:" + json); 
    if (TextUtils.isEmpty(json)) return null; 
    byte[] data = json.getBytes(); 

    GZIPInputStream gzipInputStream; 
    ByteArrayOutputStream baos; 
    InputStream inStrm; 
    HttpURLConnection conn; 

    conn = (HttpURLConnection) new URL(url).openConnection(); 
    conn.setReadTimeout(60*1000); 
    conn.setConnectTimeout(60*1000); 
    conn.setRequestMethod("POST"); 
     /* 允许Input、Output,不使用Cache */ 
    conn.setDoInput(true); // 表示从服务器获取数据 
    conn.setDoOutput(true);// 表示向服务器写数据 
    conn.setUseCaches(true); //不使用缓存,每次请求的数据,都需要是新的 
    conn.setRequestProperty("Content-Type", "application/x-tar"); 
    conn.setRequestProperty("Content-Length", String.valueOf(data.length)); 
    conn.setRequestProperty("Accept-Encoding", "gzip"); 
    conn.setRequestProperty("Connection", "Keep-Alive"); 
    conn.setRequestProperty("Charset", "UTF-8"); 

    BufferedOutputStream bos = new BufferedOutputStream(conn.getOutputStream()); 
    bos.write(json.getBytes()); 
    bos.flush(); 
    bos.close(); 

    int status; 
    inStrm = conn.getInputStream(); // <===注意,实际发送请求的代码段就在这里 
    status = conn.getResponseCode(); 

    if (status == HttpURLConnection.HTTP_OK) { 
     String contentEncoding = conn.getContentEncoding(); 
     /** 判断是否是GZIP **/ 
     boolean isGzipEncoding = false; 

     // 读取数据 
     if ((null != contentEncoding) 
       && contentEncoding.equalsIgnoreCase("gzip")) { 
      isGzipEncoding = true; 
     } 

     if (isGzipEncoding) { 
      // 如果是GZIP压缩 
      gzipInputStream = new GZIPInputStream(inStrm); 
      baos = new ByteArrayOutputStream(); 
      byte[] readBuffer = new byte[1024]; 
      int len; 
      while ((len = gzipInputStream.read(readBuffer)) != -1) { 
       baos.write(readBuffer, 0, len); 
      } 

      return baos.toString("utf-8"); 

     } else { 
      baos = new ByteArrayOutputStream(); 
      int len; 
      byte[] readBuffer = new byte[1024]; 
      while ((len = inStrm.read(readBuffer)) != -1) { 
       baos.write(readBuffer, 0, len); 
      } 

      return baos.toString("utf-8"); 
     } 
    } 

    conn.disconnect(); 

    try { 
     if (null != inStrm) { 
      inStrm.close(); 
     } 

    } catch (Exception ignored) { 
    } 
    return null; 
} 

JSON:

{ 
    "userAgent": { 
    "imsi": "460013882300329", 
    "imei": "867694020669042", 
    "androidSystemVer": "5.1.1", 
    "screenSize": "1440*2560", 
    "ramSize": "3712", 
    "romSize": "56056", 
    "cpu": "AArch64 Processor rev 2 (aarch64) ", 
    "hsman": "Xiaomi", 
    "hstype": "MI NOTE Pro", 
    "networkType": "3", 
    "provider": "中国联通", 
    "packageName": "com.jolo.push4_0", 
    "apkVer": "1.0001", 
    "dpi": "640", 
    "apkVerInt": "100001", 
    "mac": "58:44:98:43:fe:cd", 
    "installTime": "1482807931757", 
    "terminalId": "", 
    "channelCode": "74999699", 
    "lat": "0.0", 
    "lng": "0.0" 
    }, 
    "businessCode": 2001, 
    "uuid": "", 
    "userApks": "H4sIAAAAAAAAAFVW23KjOhD8FT+eU+WdkrhTftqn87TfkBKggGKQCAI7+OtPj4SdbKUSOdagmenpbtG6iYa5Wahx3j8GMxt7OueUitO5Si4tdkfnrvxLX8b2g7P9uzavL09nSQiVF7f01Ot1VHbVi6VjPZ1TSig//ZMIWUiRZCSrpEjkv6dzkhQiy2VShyTWKNfrxnwY7JAgiTPLsDO5fvsw+nSuSeInzUrkq6UUQoR9ZbvFmY4aZa+qaTljHkpKw/aHG6zdqccu14pzY1fejNq2uttWulp3v2u1DnoJIaj3LLNLa4kD3awtinAtwyIowyKymNq8j/uqr+RnrduhHd3WBTwIxeUpPvISIjujLJDt6SZjI6EHIeMxD+U65aifPT+ehvz5pZ0ampuYVXLWGP2+WT8YZ+lmOu1oHtXOdQs8J3FqEktrlOk2Mnbe1rfJ3IrTuQAsOeBHiBSXSZMeAWpJCZIlEeqVEbErTROHp5Riry7igR7HdaYzNHvbc8IDDFnFDvddr54eZtoeW0RRRBS55BEleve+Mo520arTy8yDEoRyUlE9Z/kYlANM5F1r1MhFZAQciyz90dRqdKPQlDUcUINfTBYhkzwt0uSvRlZ31ZajKi61zCOh3lUAsFfjqJed9KT60/lPBYImIk3Frz+/Gcbnv5FFmF//otry9aFuSs0zN8rQhpir23DuFYxaFd1275ZIhtCkzMqyTLjTEHvHUQ60VqR3PevVPBjSlAJBZV4c1B0xXxyavYlwlBBJIBXWEKBpXtyHbtegGd6KglXA2D4Gt02O7loDg44PTxnLMrLIb7NeWj2O1I6Aw71jsZ7u3Qd0T6WomRdVKo+xmAHTV2bcnxhwxoKLLfNYy7IpO8EYzDq4SQcVJgyjEGl+cFJvgQN660wQUxr4c3BPz3dtrpri359Zvkn9xL8dlpAjZ3iTUmRUsa7xQVTyQDiA1+nJtW6zq+++nco4mpTF/LF90yP0vYTWOJkUIaaAveQiku7T7ObQGk55yq2UDFAp/+bb5BrYyucnU67ggCyP1XSPTzLgmV61X1+VRHtrrzCGxq0HW/BQ2NgaDEg1gRUyeAJzEgySR2FfOBDVKAjim5uMa0ZFzaOGIo7xodluczyeZZk+grz0ukfC1cyb6secXyfBrAOtnk1M6go8rd4JNwW13q/b6pYgVPA2DR1ZmES7YnnOqjO9YXrT0I3927IPjbfJG6Qlaga8DuKoq79gtPruuZGESiyJOBhyw4Xi1mBaNe9IUdZlGR+1QFZ5TTe2ay49JfFU8cGe3rl+fFEreuOkQdeO4Dm7CY8lLEGJWwn1lb/UMmnVmF+3UmETvillfvgBEGUKwQSAyzhyuUUAS5TZQQr+nu5mgdH62E8RxpIelukntazGg4s+fn53I5yRlFORCyWaLGPznztvHKXzP/0GSnJYUKqsD0tQGIlVN0Psj5OaGayKrwaZA++8OrCwznWjbhVLbVydV90NwG+LjhcQdJlFDxoNhgLqR9Pm3UCJg1k7XheUYx5V/G2aJBf9BVch36PhP0XQEzvakdYbq1jhjWOFgF0oPU0P2+pgsfz7ypWjN7746qiUVbkGt2Rc+PnoeVl+qEG5yUQcnw6E7JLtWeBN42fQgFcejb4HZmASrs30OdknkcJtPm3etK/2quKy3rhMCGEjKN0EokWNpGx1FzxNzrcD9xnuhxs4TPKfQEPIOE/4zefwYP19o/wezaz2/2YolUcgwrWBRxLB7wJH9fM8mtuLwDAjDPlvLzGbeb0WbD0zmmkEzqVPZb4y4uaInMWsq+zyP0nx3c4HCgAA" 
} 

LogCat:

[email protected]t.SocketTimeoutException 
12-27 11:06:06.121 10462-11341/com.jolo.push4_0 W/System.err:  at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488) 
12-27 11:06:06.121 10462-11341/com.jolo.push4_0 W/System.err:  at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:37) 
12-27 11:06:06.121 10462-11341/com.jolo.push4_0 W/System.err:  at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:237) 
12-27 11:06:06.121 10462-11341/com.jolo.push4_0 W/System.err:  at com.android.okio.Okio$2.read(Okio.java:113) 
12-27 11:06:06.131 10462-11341/com.jolo.push4_0 W/System.err:  at com.android.okio.RealBufferedSource.indexOf(RealBufferedSource.java:147) 
12-27 11:06:06.131 10462-11341/com.jolo.push4_0 W/System.err:  at com.android.okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:94) 
12-27 11:06:06.131 10462-11341/com.jolo.push4_0 W/System.err:  at com.android.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:179) 
12-27 11:06:06.131 10462-11341/com.jolo.push4_0 W/System.err:  at com.android.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:101) 
12-27 11:06:06.131 10462-11341/com.jolo.push4_0 W/System.err:  at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:628) 
12-27 11:06:06.131 10462-11341/com.jolo.push4_0 W/System.err:  at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:388) 
12-27 11:06:06.131 10462-11341/com.jolo.push4_0 W/System.err:  at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:332) 
12-27 11:06:06.131 10462-11341/com.jolo.push4_0 W/System.err:  at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:199) 
12-27 11:06:06.131 10462-11341/com.jolo.push4_0 W/System.err:  at com.jolo.push4_0.net.OkHttpWrapper.postMethod(OkHttpWrapper.java:76) 
12-27 11:06:06.131 10462-11341/com.jolo.push4_0 W/System.err:  at com.jolo.push4_0.net.BaseNetUtil$NetTask.doInBackground(BaseNetUtil.java:72) 
12-27 11:06:06.131 10462-11341/com.jolo.push4_0 W/System.err:  at com.jolo.push4_0.net.BaseNetUtil$NetTask.doInBackground(BaseNetUtil.java:64) 
12-27 11:06:06.131 10462-11341/com.jolo.push4_0 W/System.err:  at android.os.AsyncTask$2.call(AsyncTask.java:292) 
12-27 11:06:06.131 10462-11341/com.jolo.push4_0 W/System.err:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
12-27 11:06:06.131 10462-11341/com.jolo.push4_0 W/System.err:  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
12-27 11:06:06.131 10462-11341/com.jolo.push4_0 W/System.err:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
12-27 11:06:06.131 10462-11341/com.jolo.push4_0 W/System.err:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
12-27 11:06:06.131 10462-11341/com.jolo.push4_0 W/System.err:  at java.lang.Thread.run(Thread.java:818) 

Буду признателен, если вы можете дать мне несколько советов.

ответ

0

из https://stackoverflow.com/a/24614909/7267105

погрешность не может быть решена с помощью клиента, так как она представляет собой сеть связанных с проблемой. Однако, что вы можете сделать, это повторить попытку несколько раз. Это может работать как временное решение, пока не будет исправлена ​​реальная проблема.

for (int retries = 0; retries < 3; retries++) { 
    try { 
     final HttpClient client = createHttpClientWithDefaultSocketFactory(null, null); 
     final HttpResponse response = client.execute(get); 
     final int statusCode = response.getStatusLine().getStatusCode(); 
     if (statusCode != 200) { 
      throw new IllegalStateException("GET Request on '" + get.getURI().toString() + "' resulted in " + statusCode); 
     } else {     
      return response.getEntity(); 
     } 
    } catch (final java.net.SocketTimeoutException e) { 
     // connection timed out...let's try again     
    } 
} 

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

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