连接超时设置

如果 URL 连接时间超过5秒,我想返回 false-这怎么可能使用 Java?下面是我用来检查 URL 是否有效的代码

HttpURLConnection.setFollowRedirects(false);
HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
con.setRequestMethod("HEAD");
return (con.getResponseCode() == HttpURLConnection.HTTP_OK);
231047 次浏览

HttpURLConnection有一个 SetConnectTimeout方法。

只需将超时设置为5000毫秒,然后捕获 java.net.SocketTimeoutException

您的代码应该是这样的:


try {
HttpURLConnection.setFollowRedirects(false);
HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
con.setRequestMethod("HEAD");


con.setConnectTimeout(5000); //set timeout to 5 seconds


return (con.getResponseCode() == HttpURLConnection.HTTP_OK);
} catch (java.net.SocketTimeoutException e) {
return false;
} catch (java.io.IOException e) {
return false;
}



你可以像这样设置暂停,

con.setConnectTimeout(connectTimeout);
con.setReadTimeout(socketTimeout);

如果 HTTP Connection 没有超时,您可以在后台线程本身(AsyncTask、 Service 等)中实现超时检查器,下面的类是 Customize AsyncTask 的示例,它会在某个时间段后超时

public abstract class AsyncTaskWithTimer<Params, Progress, Result> extends
AsyncTask<Params, Progress, Result> {


private static final int HTTP_REQUEST_TIMEOUT = 30000;


@Override
protected Result doInBackground(Params... params) {
createTimeoutListener();
return doInBackgroundImpl(params);
}


private void createTimeoutListener() {
Thread timeout = new Thread() {
public void run() {
Looper.prepare();


final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {


if (AsyncTaskWithTimer.this != null
&& AsyncTaskWithTimer.this.getStatus() != Status.FINISHED)
AsyncTaskWithTimer.this.cancel(true);
handler.removeCallbacks(this);
Looper.myLooper().quit();
}
}, HTTP_REQUEST_TIMEOUT);


Looper.loop();
}
};
timeout.start();
}


abstract protected Result doInBackgroundImpl(Params... params);
}

这个样本

public class AsyncTaskWithTimerSample extends AsyncTaskWithTimer<Void, Void, Void> {


@Override
protected void onCancelled(Void void) {
Log.d(TAG, "Async Task onCancelled With Result");
super.onCancelled(result);
}


@Override
protected void onCancelled() {
Log.d(TAG, "Async Task onCancelled");
super.onCancelled();
}


@Override
protected Void doInBackgroundImpl(Void... params) {
// Do background work
return null;
};
}

我可以得到解决这样一个类似的问题,添加一个简单的行

HttpURLConnection hConn = (HttpURLConnection) url.openConnection();
hConn.setRequestMethod("HEAD");

我的要求是了解响应代码,因此仅仅获得元信息就足够了,而不是获得完整的响应主体。

默认的请求方法是 GET,这需要很长时间才能返回,最后抛出了 SocketTimeoutException。当我将 Request Method 设置为 HEAD 时,响应非常快。

可以设置 System 属性 sun.net.client.defaultConnectTimeout。该值以毫秒为单位。这将为每个请求设置默认超时-

通过设置 JVM 选项-

- Dsun.net.client.defaultConnectTimeout = 5000

在 java 代码中的 OR-

SetProperty (“ sun.net.client.defaultConnectTimeout”,“5000”) ;