Tomcat ist nicht bündig, die Antwort Puffer
getestet habe ich HttpResponse#flushBuffer
und PrintWriter#flush
auf Tomcat 7
unten, aber es schien, dass die Reaktion eher ignoriert als geleert, der Inhalt über den Draht so schnell wie möglich als erwartet.
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/HelloServlet")
public class HelloServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
PrintWriter pw = response.getWriter();
pw.println("say hi now");
pw.flush();
response.flushBuffer();
try {
Thread.sleep(5000);
} catch (Exception e) {
}
pw.println("say bye in 5 seconds");
}
}
Den brower angezeigt "hi" und "bye" zusammen, nach der Verzögerung. Ist es ein Fehlverhalten oder Absicht?
@EDIT
Laut @Tomasz Nurkiewicz
's Vorschlag, getestet habe ich wieder mit curl
dann das Problem Weg war. Es scheint, dass die standard-Browser und tcp/ip monitor
pack small pieces of contents
aus der gleichen http-Antwort gerendert Ihnen zusammen.
@EDIT 2
Es ist auch festzustellen, dass beide HttpResponse#flushBuffer
und PrintWriter#flush
Fahrt Tomcat 7
zu senden, die client -chunkdaten.
- Ich glaube, es ist ein app-server-Konfiguration. Bitte, sehen Sie unter mein Beitrag.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die API für
flushBuffer()
ist sehr präzise:Also entweder Tomcat ist nicht implementiert gemäß der Spezifikation (Puffer mehr aggressiv und hält erröten, wenn Sie zu klein) oder der client (browser) wartet auf weitere Eingaben, bevor Sie tatsächlich zu Rendern.
Können Sie versuchen mit curl oder
nc
statt?curl
. Es sollteunrelated
zu tomcat.Ich hatte gerade das gleiche Problem. Zu stoppen Browser zu warten bis die Seite fertig geladen ist, bevor Sie Rendern Sie brauchen, um zu beginnen mit:
Hatte ich das Problem auch. Und ich fand auch, dass das Problem verschwindet mit curl.
Mit einigen schnüffeln, es stellte sich heraus, dass der Täter ist die gzip-Codierung. Damit komprimieren Sie die Antwort, gzip wartet, bis die zugrunde liegende PrintWriter geschlossen ist (das heißt, bis die vollständige Antwort geschrieben ist) und erzeugt dann die komprimierte Ausgabe. Auf der client-Seite, das bedeutet, dass Sie nicht bekommen nichts zurück, bis die vollständige Antwort ist bereit. LOCKE, auf der anderen Seite, nicht Frage ein Accept-Encoding: gzip auf dem server, und das ist der Grund, warum das Ding funktioniert, und Sie können das aufgeteilter Ausgabe, die normalerweise als gedacht.
Einen noch unerwähnt mögliche Ursache für dieses Phänomen ist die anti-Viren-software. Ich beobachtete das gleiche Verhalten auf meinem Rechner: server sendet chunkdaten, curl gearbeitet, normalen Browsern nicht, und auch Fiddler bestätigt, dass es nicht die server, die das blockiert. So nach einer Weile ich vermutete, dass der web-Schutz von Sophos (anti-virus-software, dass mein Arbeitgeber nutzt) zu stören, und tatsächlich, Sie bestätigen, im https://community.sophos.com/kb/en-us/115656, dass Sie blockieren chunkdaten, bis die Reaktion abgeschlossen ist, außer für bestimmte mime-Typen werden oft verwendet für streaming-media-Daten.
Als ein quick-check kann man auch laufen, die HTTP-Push demo in http://www.pushlets.com. Wenn es nicht funktioniert, ist es sehr wahrscheinlich, dass der Kunde hat ein generelles problem mit der Behandlung von chunked-Daten vom Typ text/html richtig.