Запись в поток комет с использованием Tomcat 6.0 - PullRequest
1 голос
/ 25 марта 2010

Эй, я новичок в java-сервлетах и ​​пытаюсь написать такой, который использует комету, чтобы я мог создать длинный 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);
        }
    } 

Любая помощь будет оценена.

1 Ответ

2 голосов
/ 26 марта 2010

Если вы новичок в сервлетах и ​​пытаетесь запустить код Comet на Tomcat, хорошим началом будет запуск кода примера из http://tomcat.apache.org/tomcat-6.0-doc/aio.html.

Очень очень важно (с этой страницы): " ВАЖНОЕ ПРИМЕЧАНИЕ. Для использования этих функций необходимо использовать HTTP-соединители APR или NIO. Классический HTTP-соединитель java.io и соединители AJP их не поддерживают. * "

Если вы не настроите свой экземпляр Tomcat для использования NIO вместо простого HTTP-коннектора, Comet не будет работать.

...