2010-03-24 2 views
1

Эй, я новичок в сервлетах Java, и я пытаюсь написать тот, который использует комету, чтобы я мог создать длинный запрос Ajax для опроса. Я могу успешно запустить поток и выполнить операции, но я ничего не могу написать. Вот мой код:Запись в поток комет с помощью tomcat 6.0

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); 
     } 
    } 

Любая помощь будет принята с благодарностью.

+0

Одна из проблем, которые я вижу, заключается в том, что вы никогда не добавляете свое соединение в список, например: 'if (cometEvent.getEventType() == CometEvent.EventType.BEGIN) {... synchronized (connections) {connections.add (ответ);}} 'Но это, вероятно, не решение. –

+0

О, это правда, я этого не делаю. Это не проблемы, а благодарность за улов. –

ответ

2

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

Очень очень важно (с этой страницы) является «. Важное замечание:. Использование этих функций требует использования разъемов APR или НИО HTTP Классический разъем java.io HTTP и разъемы AJP не поддерживают их»

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

+0

Я изменил соединение protocal в файле server.xml на следующее: Это то, что вы имеете в виду? потому что если это тогда, это не поможет. –

+0

Это помогает, но это также означает, что у вас есть другие проблемы в коде. Использует ли образец код для вас? – stevedbrown

 Смежные вопросы

  • Нет связанных вопросов^_^