3 Stimmen

Wie kann ein Java-Servlet bestätigen, dass die Antwort vom Client empfangen wurde?

Ich habe einen Java-Servlet, der HTTP GET-Anforderungen von einem Client verarbeitet. Nach der Bearbeitung einer Anfrage sendet er HTTP 200 OK zurück und die Antwort enthält einige hundert Bytes an Daten.

Es gibt eine spezifische Fehlerbedingung, bei der der Client zur gleichen Zeit vom Netzwerk getrennt wird, wenn die Antwort gesendet wird. Die Daten werden vom Servlet an den Ausgabestrom geschrieben und der Ausgabestrom wird gespült. Zum Zeitpunkt, wenn der Ausgabestrom gespült wird, weiß der Server nicht, dass der Client nicht verbunden ist. (Die Verbindung wurde abrupt von einem Punkt zwischen Client und Server unterbrochen, sodass der Client keine Chance hat, die TCP-Verbindung ordnungsgemäß zu schließen - kein TCP RST wird vom Server gesehen.)

Die Frage ist, gibt es einen Weg für das Servlet, diese Bedingung zu erkennen? Ich habe bereits zwei Dinge überprüft:

  1. Es werden keine Ausnahmen im Servlet ausgelöst. Ich hatte gehofft, dass diese Bedingung zu einer IOException führen würde, aber das scheint nicht zu passieren.
  2. Ich rufe PrintWriter.checkError() auf dem PrintWriter auf, der zum Schreiben an den Client verwendet wird, auf und es gibt false (keinen Fehler) zurück, selbst wenn diese Fehlerbedingung auftritt.

Soweit ich das beurteilen kann, gibt es also keinen Weg für den Server, das festzustellen. Aber es scheint mir, dass es basierend auf dem Fehlen einer Bestätigung vom TCP-Stack des Clients möglich sein sollte. Vielleicht ist dies jedoch nicht für das Servlet zugänglich.

Nicht sicher, ob es relevant ist, aber ich benutze Tomcat 7.0.26.

0voto

user207421 Punkte 297318

Es kann nicht. Die Antwort kann komplett vom Container zwischengespeichert und erst geschrieben werden, nachdem Ihr Servlet-Code beendet wurde.

Sie dürfen sich nicht darauf verlassen, dass der Client die Antwort in Ihrer Anwendung erhält. Das nennt man Idempotenz: Suchen Sie danach.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X