【发布时间】:2026-02-09 14:20:12
【问题描述】:
HttpURLConnection GET 方法仅在 api 22 中在调试模式下有效,而在其他 api 中它可以正常工作。有时它会起作用,但在大约 4 种情况下的 3 种情况下,它会触发异常:
E/Http GET HttpURLConnection:﹕ 2015/05/15 13:18:04 failed to connect to /10.254.254.1 (port 80) after 5000ms
这是我的代码:
try
{
URL url = new URL(path);
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setInstanceFollowRedirects(false);
urlConnection.setConnectTimeout(5000);
urlConnection.setReadTimeout(5000);
urlConnection.setRequestMethod("GET");
urlConnection.setRequestProperty("User-Agent", USER_AGENT);
urlConnection.setRequestProperty("Content-Type", "text/plain;charset=utf-8");
int responseCode = urlConnection.getResponseCode();
mFunctions.AddLog(3, "Http GET responseCode: ", Integer.toString(responseCode));
BufferedReader in = new BufferedReader(
new InputStreamReader(urlConnection.getInputStream()));
String inputLine = in.readLine();
return inputLine;
} catch (MalformedURLException e)
{
mFunctions.AddLog(3, "Http GET URL: ", e);
} catch (IOException e)
{
mFunctions.AddLog(3, "Http GET HttpURLConnection: ", e);
}
finally
{
urlConnection.disconnect();
}
我尝试使用HttpOk 而不是HttpUrlConnection,这次问题在 api 22 上是一样的,我得到另一个异常:
6371-6611/kepardvpn.client W/System.err﹕ java.net.SocketTimeoutException: failed to connect to /10.254.254.1 (port 80) after 15000ms
05-15 20:05:52.364 6371-6611/kepardvpn.client W/System.err﹕ at libcore.io.IoBridge.connectErrno(IoBridge.java:169)
05-15 20:05:52.364 6371-6611/kepardvpn.client W/System.err﹕ at libcore.io.IoBridge.connect(IoBridge.java:122)
05-15 20:05:52.364 6371-6611/kepardvpn.client W/System.err﹕ at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
05-15 20:05:52.364 6371-6611/kepardvpn.client W/System.err﹕ at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:456)
05-15 20:05:52.364 6371-6611/kepardvpn.client W/System.err﹕ at java.net.Socket.connect(Socket.java:882)
05-15 20:05:52.364 6371-6611/kepardvpn.client W/System.err﹕ at com.squareup.okhttp.internal.Platform$Android.connectSocket(Platform.java:197)
05-15 20:05:52.364 6371-6611/kepardvpn.client W/System.err﹕ at com.squareup.okhttp.Connection.connect(Connection.java:156)
05-15 20:05:52.364 6371-6611/kepardvpn.client W/System.err﹕ at com.squareup.okhttp.Connection.connectAndSetOwner(Connection.java:175)
05-15 20:05:52.364 6371-6611/kepardvpn.client W/System.err﹕ at com.squareup.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:120)
05-15 20:05:52.364 6371-6611/kepardvpn.client W/System.err﹕ at com.squareup.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:330)
05-15 20:05:52.364 6371-6611/kepardvpn.client W/System.err﹕ at com.squareup.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:319)
05-15 20:05:52.364 6371-6611/kepardvpn.client W/System.err﹕ at com.squareup.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:241)
05-15 20:05:52.364 6371-6611/kepardvpn.client W/System.err﹕ at com.squareup.okhttp.Call.getResponse(Call.java:271)
05-15 20:05:52.364 6371-6611/kepardvpn.client W/System.err﹕ at com.squareup.okhttp.Call$ApplicationInterceptorChain.proceed(Call.java:228)
05-15 20:05:52.364 6371-6611/kepardvpn.client W/System.err﹕ at com.squareup.okhttp.Call.getResponseWithInterceptorChain(Call.java:199)
05-15 20:05:52.364 6371-6611/kepardvpn.client W/System.err﹕ at com.squareup.okhttp.Call.execute(Call.java:79)
05-15 20:05:52.364 6371-6611/kepardvpn.client W/System.err﹕ at kepardvpn.client.HttpConnections.get(HttpConnections.java:196)
05-15 20:05:52.364 6371-6611/kepardvpn.client W/System.err﹕ at kepardvpn.client.Functions$GetCurrentIPTask.doInBackground(Functions.java:1549)
05-15 20:05:52.364 6371-6611/kepardvpn.client W/System.err﹕ at kepardvpn.client.Functions$GetCurrentIPTask.doInBackground(Functions.java:1537)
05-15 20:05:52.364 6371-6611/kepardvpn.client W/System.err﹕ at android.os.AsyncTask$2.call(AsyncTask.java:292)
05-15 20:05:52.364 6371-6611/kepardvpn.client W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:237)
05-15 20:05:52.365 6371-6611/kepardvpn.client W/System.err﹕ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
05-15 20:05:52.365 6371-6611/kepardvpn.client W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
05-15 20:05:52.365 6371-6611/kepardvpn.client W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
05-15 20:05:52.365 6371-6611/kepardvpn.client W/System.err﹕ at java.lang.Thread.run(Thread.java:818)
这是我的代码:
OkHttpClient client = new OkHttpClient();
client.setConnectTimeout(15, TimeUnit.SECONDS); // connect timeout
client.setReadTimeout(30, TimeUnit.SECONDS); // socket timeout
client.networkInterceptors().add(new UserAgentInterceptor(USER_AGENT));
Request request = new Request.Builder()
.url(path)
.build();
Response response = null;
try
{
response = client.newCall(request).execute();
InputStream in = null;
in = response.body().byteStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String result, line = reader.readLine();
//TimeUnit.MILLISECONDS.sleep(2000);
result = line;
while ((line = reader.readLine()) != null)
{
result += line;
}
if (response.code() == 200)
return result;
}
catch (IOException e)
{
e.printStackTrace();
}
【问题讨论】:
-
HttpUrlConnection 与 AsynTask 对于休息请求来说是一个糟糕的选择。相反,Volley 库很棒。
标签: android get httpurlconnection