HttpURL 접속 타임아웃 설정
URL 접속에 5초 이상 걸리면 false를 반환하고 싶은데 Java를 사용하면 어떻게 될까요?URL이 유효한지 확인하기 위해 사용하는 코드는 다음과 같습니다.
HttpURLConnection.setFollowRedirects(false);
HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
con.setRequestMethod("HEAD");
return (con.getResponseCode() == HttpURLConnection.HTTP_OK);
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 등)에 구현할 수 있습니다.다음 클래스는 특정 기간 후 타임아웃되는 비동기 태스크 사용자 정의의 예입니다.
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;
};
}
시스템 속성 sun.net.client.defaultConnectTimeout을 설정할 수 있습니다.값은 밀리초 단위입니다.그러면 각 요청의 기본 타임아웃이 설정됩니다.
JVM 옵션 중 하나를 설정함으로써
- Dsun.net . client . default Connect Timeout = - - -
자바 코드에서의 OR-
System.setProperty("sun.net.client.defaultConnectTimeout", "setProperty");
간단한 라인을 추가하면 비슷한 문제를 해결할 수 있었다.
HttpURLConnection hConn = (HttpURLConnection) url.openConnection();
hConn.setRequestMethod("HEAD");
나의 요구는 응답 코드를 아는 것이었고, 그것을 위해서는 완전한 응답 본체를 얻는 것이 아니라 메타 정보를 얻는 것으로 충분했다.
기본 요청 방식은 GET으로 반환에 시간이 많이 걸리고 마지막으로 Socket Timeout이 발생하였습니다.예외.Request Method를 HEAD로 설정했을 때 응답이 매우 빨랐습니다.
언급URL : https://stackoverflow.com/questions/2799938/httpurlconnection-timeout-settings
'programing' 카테고리의 다른 글
set Timeout 콜백에 올바른 "이" 컨텍스트를 전달하시겠습니까? (0) | 2022.09.21 |
---|---|
PHP 시스템의 로컬 IP를 가져오는 방법 (0) | 2022.09.21 |
python re.sub 그룹: \number 뒤의 숫자 (0) | 2022.09.21 |
nodejsmysql 오류: Connection lost 서버가 연결을 닫았습니다. (0) | 2022.09.20 |
PHP는 속성이 개체 또는 클래스에 있는지 확인합니다. (0) | 2022.09.20 |