Ich schreibe gerade eine Comet-Anwendung, die es mir erfordert, Datenblöcke gleichzeitig auf einer persistenten Verbindung zu senden. Ich habe jedoch Probleme beim Löschen der Nachricht an den Client vor dem Schließen der Verbindung. Gibt es einen Grund dafür, dass sich die PrintWriter.flush() -Methode nicht so verhält, wie ich denke?Java-Servlets: Warum wird PrintWriter.flush() nicht gespült?
Dies ist meine Tomcat Comet Implementierung:
public void event(CometEvent event) throws IOException, ServletException {
HttpServletRequest request = event.getHttpServletRequest();
HttpServletResponse response = event.getHttpServletResponse();
if (event.getEventType() == EventType.BEGIN) {
request.setAttribute("org.apache.tomcat.comet.timeout", 300 * 1000);
PrintWriter out = response.getWriter();
out.println("BEGIN!");
out.flush();
System.out.println("EventType.BEGIN");
} else if (event.getEventType() == EventType.READ) {
InputStream is = request.getInputStream();
byte[] buf = new byte[512];
do {
int n = is.read(buf); //can throw an IOException
if (n > 0) {
System.out.println("Read " + n + " bytes: " + new String(buf, 0, n)
+ " for session: " + request.getSession(true).getId());
} else if (n < 0) {
return;
}
} while (is.available() > 0);
System.out.println("subtype: "+event.getEventSubType());
System.out.println("EventType.READ");
} else if (event.getEventType() == EventType.END) {
PrintWriter out = response.getWriter();
out.println("END!");
out.close();
System.out.println("checkError: "+out.checkError());
System.out.println(event.getEventSubType());
System.out.println("EventType.END");
//eventWorker.enqueue(new EndEvent(request, response));
} else if (event.getEventType() == EventType.ERROR) {
PrintWriter out = response.getWriter();
out.println("ERROR!");
out.flush();
System.out.println("checkError: "+out.checkError());
System.out.println("subtype: "+event.getEventSubType());
//response.getWriter().close();
System.out.println("EventType.ERROR");
} else {
(new ServletException("EXCEPTION")).printStackTrace();
}
}
Also hier die Nachricht Ich versuche zu senden "BEGIN!" und halte die Verbindung danach offen, damit ich mehr Daten senden kann. Es scheint jedoch, dass die Nachricht nicht ausgeführt wird, bis die Verbindung geschlossen ist.
Das ist mein Ajax-Code: $ .post ('Komet', Funktion (Daten) {Alarm (Daten);});
Nachdem ich diesen Code ausführen, Firebug sagt mir, dass dies die Antwort-Header: Server: Apache-Coyote/1.1 Transfer-Encoding: Chunked Datum: Mo, 13. Juli 2009 21.16.29 GMT
Das führt mich zu der Annahme, dass mein Browser einige Daten zurück erhalten hat, aber wie aktualisiere ich etwas auf der Seite, bevor die Verbindung geschlossen wird?
Also hier versuche ich die Nachricht "BEGINN!" und halte die Verbindung danach offen, damit ich mehr Daten senden kann. Es scheint jedoch, dass die Nachricht nicht ausgeführt wird, bis die Verbindung geschlossen ist. – jcee14
Ok, versuche response.flushBuffer()? Wenn das nicht funktioniert, versuchen Sie eine Tonne mehr Bytes zu schreiben. Welchen Anschluss verwenden Sie APR oder NIO? Sollte nicht Firebug dir auch sagen, was in der Antwort ist? Es sieht so aus, als ob Sie nur die Antwortheader erhalten. –