0

호스트 B에서 서버에 메시지를 POST하기 위해 Apache HTTPClient (4.2.5)를 사용하는 호스트 A에 클라이언트가 있습니다. 호스트 A에서 연결 및 읽기/소켓 시간 초과를 설정하고 있습니다. 권장 패션 : 나는 클라이언트 전송이 갑자기 종료되는 경우에 시간 제한 동작을 테스트하려고하고아웃 바운드 스트림이 원격 장애로 인해 중단되면 Apache HTTPClient가 시간 초과 구성을 무시합니까?

client = new DefaultHttpClient(); 
params = client.getParams(); 
HttpConnectionParams.setConnectionTimeout(params, 5000); 
HttpConnectionParams.setSoTimeout(params, 20000); 

일부 전부는 아니지만의 후 (호스트 B에 대상 서버의 충돌에 의해 예) 데이터 스트림이 전송되었습니다. 내 테스트 방법 따라서있다 :

  1. 호스트 A에 클라이언트 응용 프로그램에서 HTTP의 POST를 시작
  2. 로그 클라이언트가 기본 아파치 HttpClient를 프레임 워크를 호출 한 것을 나타 내기 직후에 호스트 B에 방화벽 규칙을 활성화 호스트 A의 트래픽을 차단하십시오.

사실상 테스트가 중간 스트림의 요청 데이터를 차단한다는 것을 패킷 캡처를 통해 확인할 수 있습니다.

내가 나중에 읽기 제한 시간 간격 후 (20 초) 시간 초과하는 클라이언트 응용 프로그램을 예상했을 것이다

,하지만 내가 대신보고하고있어 클라이언트가 더 이상 간격합니다 (5백-6백초이 범위에 대한 응답이다) 마지막으로 발생하기 전에 제한 시간을 연결하십시오.

클라이언트가 내가 타임 아웃으로 지정한 내용을 무시하는 이유에 대해 설명 할 수 있습니까 (또는 실패 할 수도 있습니다)? 이 경우 타임 아웃을 시행 할 수있는 방법이 있습니까?

답변

1

왜 작동하지 않겠지 만 HttpClient를 인스턴스화하기 전에 Params 객체를 만드는 대체 접근 방식을 시도해 볼 수 있습니다. 이 효과에

뭔가 :

 
HttpParams params = new BasicHttpParams(); 
HttpConnectionParams.setConnectionTimeout(params, 5000); 
HttpConnectionParams.setSoTimeout(params, 20000); 
HttpClient httpClient = new DefaultHttpClient(params); 

또한 클라이언트 연결 개체의 설정을 재정의 할 각 HTTP 메시지에 고유 일련의 매개 변수가 있습니다. 당신은 당신이 명시 적으로 이러한 매개 변수를 설정하려고 수 HttpMessage#getParam

또한 그들이 시간 제한 자체를 지정하여 사용하지 않는 설정 한 떠날 있는지 확인하려면 (명시 적으로 설정하지 않는 한 일어나지한다,하지만 가치 확인) 할 수 HttpGet 또는 HttPost 객체에서 직접 동작을 변경하는지 확인하십시오.