2013-04-22 8 views
3

클라이언트로부터 HTTP GET 요청을 처리하는 자바 서블릿이 있습니다. 요청을 처리 한 후 HTTP 200 OK를 보내고 응답에는 수백 바이트의 데이터가 포함됩니다.자바 서블릿이 클라이언트가 응답을 수신했는지 확인하는 방법

응답을 보내는 것과 거의 같은 시간에 클라이언트의 네트워크 연결이 끊어지는 특정 오류가 있습니다. 데이터는 서블릿에 의해 출력 스트림에 쓰여지고 출력 스트림은 플러시되고 출력 스트림이 플러시 될 때 서버는 클라이언트가 연결되어 있지 않다는 것을 알지 못합니다. (연결이 클라이언트와 서버 사이의 지점에 의해 갑자기 끊어 지므로 클라이언트는 TCP 연결을 제대로 닫을 기회를 얻지 못했습니다. 서버에서 TCP RST를 볼 수 없습니다.)

서블릿이이 상태를 감지 할 수있는 방법이 있습니까? 이미 두 가지를 확인했습니다 :

  1. 서블릿에 예외가 발생하지 않습니다. 이 조건으로 인해 IOException이 발생하기를 기대했지만 그럴 수는 없습니다.
  2. 클라이언트에 쓰는 데 사용되는 PrintWriter에서 PrintWriter.checkError()를 호출하고이 오류 조건이 발생할 경우에도 false (오류 없음)를 반환합니다.

그래서 내가 알기로는 서버가이를 알 수있는 방법이 없다는 것을 알 수 있습니다. 그러나 그것은 클라이언트의 TCP 스택으로부터의 응답이 부족하다는 것을 기반으로 가능해야합니다. 그러나 이것은 아마도 서블릿에 노출되지 않습니다.

중요한지 여부는 확실하지 않지만 Tomcat 7.0.26을 사용하고 있습니다.

답변

0

수 없습니다. 응답은 컨테이너에 의해 완전히 버퍼링 될 수 있으며 서블릿 코드가 종료 된 후에 만 ​​작성됩니다.

응용 프로그램에 응답을받는 클라이언트에 의존해서는 안됩니다. 이것을 멱등 원이라고 부릅니다.

+0

답변을 주셔서 감사합니다. 나는 멱수설에 대한 생각을 이해한다고 생각하지만, "어떤 의존도를 구축해서는 안된다"는 것이 무엇을 의미합니까? 나의 이해가 모든 HTTP 메소드가 멱등수 일 필요는 없다. 게시하다. – prime13

관련 문제