Java의 URLConnection을 기반으로 BufferedReader에 대한 시간 초과를 어떻게 설정할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/93357

  •  01-07-2019
  •  | 
  •  

문제

URL의 내용을 읽고 싶지만 URL이 응답하지 않으면 "중단"되고 싶지 않습니다.URL을 사용하여 BufferedReader를 만들었습니다...

URL theURL = new URL(url);
URLConnection urlConn = theURL.openConnection();
urlConn.setDoOutput(true);
BufferedReader urlReader = new BufferedReader(newInputStreamReader(urlConn.getInputStream()));

...그리고 내용을 읽기 위해 루프를 시작했습니다...

do
    {
    buf = urlReader.readLine();
    if (buf != null)
        {
        resultBuffer.append(buf);
        resultBuffer.append("\n");
        }
    }
while (buf != null);

...하지만 읽기가 중단되면 애플리케이션도 중단됩니다.

필요한 경우 코드를 소켓 수준까지 작성하지 않고 읽기를 "시간 초과"할 수 있는 방법이 있습니까?

도움이 되었습니까?

해결책

나는 URLConnection.setReadTimeout이 당신이 찾고 있는 것이라고 생각합니다.

다른 팁

Java 1.4를 사용하는 경우:

연결 시간 초과를 가정합니다(URLConnection.setConnectTimeout(int timeout) ) 일종의 스트리밍을 수행하고 있기 때문에 아무 소용이 없습니다.

---스레드를 죽이지 마십시오--- 알 수 없는 문제, 설명자 열기 등이 발생할 수 있습니다.

프로세스가 완료되었는지 확인할 java.util.TimerTask를 생성하고, 그렇지 않으면 URLConnection의 BufferedReader 및 OutputStream을 닫습니다.

부울 플래그 삽입 isFinished 루프가 끝나면 true로 설정하고 루프 전에는 false로 설정합니다.

TimerTask ft = new TimerTask(){
   public void run(){
     if (!isFinished){
       urlConn.getInputStream().close();
      urlConn.getOutputStream().close();
     }
   }
};

(new Timer()).schedule(ft, timeout);

이로 인해 ioException이 발생할 수 있으므로 이를 잡아야 합니다.예외 자체는 나쁜 것이 아닙니다.일부 선언을 생략하고 있습니다(예:finals) 익명 클래스가 변수에 액세스할 수 있도록 합니다.그렇지 않다면 참조를 유지하는 POJO를 생성하고 이를 타이머태스크에 전달합니다.

Java 1.5부터는 URLConnection 클래스의 'setReadTimeout(int timeout)' 메소드를 통해 기본 소켓에서 읽기 시간 제한을 밀리초 단위로 설정할 수 있습니다.

원격 서버에 대한 초기 연결에 대해 동일한 작업을 수행하는 'setConnectTimeout(int timeout)'도 있으므로 이를 설정하는 것이 중요합니다.

나는 최근 JVM 1.4 환경에서 이 문제를 해결하기 위해 노력해 왔습니다.기본 답변은 시스템 속성 sun.net.client.defaultReadTimeout(읽기 시간 초과) 및/또는 sun.net.client.defaultConnectTimeout을 사용하는 것입니다.이것들은 다음에 문서화되어 있습니다. 네트워킹 속성 Java 명령줄의 -D 인수나 System.setProperty 메소드 호출을 통해 설정할 수 있습니다.

아마도 이들은 구현에 의해 캐시되므로 한 가지에서 다른 것으로 변경할 수 없으므로 한 번만 사용하면 값이 유지됩니다.

또한 HttpsURLConnection과 같은 SSL 연결에서는 실제로 작동하지 않습니다.사용자 정의 SSLSocketFactory를 사용하여 이를 처리하는 다른 방법이 있습니다.

다시 말하지만, 이 모든 것은 JVM 1.4.x에 적용됩니다.1.5 이상에서는 API에서 더 많은 메서드를 사용할 수 있습니다(위의 다른 응답자가 언급한 대로).

Java 1.4의 경우 Apache에서 SimpleHttpConnectionManager.getConnectionWithTimeout(hostConf,CONNECTION_TIMEOUT)을 사용할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top