【问题标题】:Writing to a comet stream using tomcat 6.0使用 tomcat 6.0 写入彗星流
【发布时间】: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);}} 但这可能不是解决方案。
  • 哦,那是真的,我不知道。这不是问题,但感谢您的收获。

标签: java comet tomcat6


【解决方案1】:

如果您不熟悉 servlet 并尝试在 Tomcat 上运行 Comet 代码,那么从 http://tomcat.apache.org/tomcat-6.0-doc/aio.html 运行示例代码是一个好的开始。

非常非常重要(来自该页面)是“重要提示:使用这些功能需要使用 APR 或 NIO HTTP 连接器。经典的 java.io HTTP 连接器和 AJP 连接器不支持它们。 em>”

如果您不将 Tomcat 实例配置为使用 NIO 而不是普通的 HTTP 连接器,Comet 将无法工作。

【讨论】:

  • 我将 server.xml 文件中的连接协议更改为: 你是这个意思吗?因为如果是,那么它没有帮助。
  • 它有帮助,但这也意味着您的代码中还有其他问题。示例代码对您有用吗?
猜你喜欢
  • 1970-01-01
  • 2011-12-23
  • 2011-01-02
  • 2010-10-10
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
相关资源
最近更新 更多