【发布时间】:2010-03-24 22:00:33
【问题描述】:
嘿,我是 java servlet 的新手,我正在尝试编写一个使用 comet 的服务,以便创建一个长轮询 Ajax 请求。我可以成功启动流并执行操作,但我无法写出任何内容。这是我的代码:
public class CometTestServlet extends HttpServlet implements CometProcessor {
/**
*
*/
private static final long serialVersionUID = 1070949541963627977L;
private MessageSender messageSender = null;
protected ArrayList<HttpServletResponse> connections = new ArrayList<HttpServletResponse>();
public void event(CometEvent cometEvent) throws IOException, ServletException {
HttpServletRequest request = cometEvent.getHttpServletRequest();
HttpServletResponse response = cometEvent.getHttpServletResponse();
//final PrintWriter out = response.getWriter();
if (cometEvent.getEventType() == CometEvent.EventType.BEGIN) {
PrintWriter writer = response.getWriter();
writer.println("<!doctype html public \"-//w3c//dtd html 4.0 transitional//en\">");
writer.println("<head><title>JSP Chat</title></head><body bgcolor=\"#FFFFFF\">");
writer.println("</body></html>");
writer.flush();
cometEvent.setTimeout(10 * 1000);
//cometEvent.close();
} else if (cometEvent.getEventType() == CometEvent.EventType.ERROR) {
log("Error for session: " + request.getSession(true).getId());
synchronized(connections) {
connections.remove(response);
}
cometEvent.close();
} else if (cometEvent.getEventType() == CometEvent.EventType.END) {
log("End for session: " + request.getSession(true).getId());
synchronized(connections) {
connections.remove(response);
}
PrintWriter writer = response.getWriter();
writer.println("</body></html>");
cometEvent.close();
} else if (cometEvent.getEventType() == CometEvent.EventType.READ) {
//handleReadEvent(cometEvent);
InputStream is = request.getInputStream();
byte[] buf = new byte[512];
do {
int n = is.read(buf); //can throw an IOException
if (n > 0) {
log("Read " + n + " bytes: " + new String(buf, 0, n)
+ " for session: " + request.getSession(true).getId());
} else if (n < 0) {
//error(cometEvent, request, response);
return;
}
} while (is.available() > 0);
}
}
任何帮助将不胜感激。
【问题讨论】:
-
我看到的一个问题是,您从未将连接添加到列表中,例如:
if (cometEvent.getEventType() == CometEvent.EventType.BEGIN) { ... synchronized(connections) {connections.add(response);}}但这可能不是解决方案。 -
哦,那是真的,我不知道。这不是问题,但感谢您的收获。