В настоящее время я пишу приложение Comet, которое требует, чтобы я отправлял порции данных одновременно по постоянному соединению. Однако у меня возникают проблемы при сбросе сообщения клиенту перед закрытием соединения. Есть ли какая-либо причина, по которой метод PrintWriter.flush () не ведет себя так, как мне кажется?
Это моя реализация Tomcat Comet:
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();
}
}
Так вот, я пытаюсь отправить сообщение "НАЧИНАЕТСЯ!" и оставьте соединение открытым, чтобы я мог отправить больше данных. Однако, кажется, что сообщение не проходит, пока соединение не будет закрыто.
Это мой код ajax:
$ .post ('comet', function (data) {alert (data);});
После запуска этого кода Firebug сообщает мне, что это заголовок ответа:
Сервер: Apache-Coyote / 1.1
Передача-кодировка: чанки
Дата: понедельник, 13 июля 2009 21:16:29 GMT
Это заставляет меня думать, что мой браузер получил некоторые данные обратно, но как мне обновить что-то на странице до закрытия соединения?