我使用httpurlconnection发送一个发布请求,但是我在与Android 5.1上方的服务器进行通信时获得了java.net.SocketTimeoutException
例外情况(包括Android 5.1),但以下是Android 5.1 5.1邮政请求是正常的。在这里是我的代码:
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:
com.jolo.push4_0.net.response.GetAdSdkConfigResp@274e153fjava.net.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)
如果您能给我一些建议,我将不胜感激。
来自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
}
}