【问题标题】:How to call this Comets application from a web page如何从网页调用此 Comets 应用程序
【发布时间】:2010-11-12 16:31:25
【问题描述】:

我已经实现了http://tomcat.apache.org/tomcat-6.0-doc/aio.html 中显示的两个类,它提供了一个使用 Tomcat 的彗星实现的信使应用程序。

如何将它连接到网络界面并显示一些内容。

我认为这些是基本步骤(我不知道细节)。

  1. 我应该创建一些传统事件 - 按钮单击或 AJAX 事件 - 调用 ChatServlet 并传入 CometEvent(以某种方式) - 可能是 BEGIN
  2. 从那时起,每当我想使用 READ 事件作为输入参数向客户端发送内容时,我的代码都会调用事件方法。

我复制了以下两个类:


package controller;

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.catalina.CometEvent;
import org.apache.catalina.CometProcessor;

public class ChatServlet extends HttpServlet implements CometProcessor {

protected ArrayList<HttpServletResponse> connections = new     ArrayList<HttpServletResponse>();
protected MessageSender messageSender = null;

public void init() throws ServletException {
    messageSender = new MessageSender();
    Thread messageSenderThread = new Thread(messageSender, "MessageSender["
            + getServletContext().getContextPath() + "]");
    messageSenderThread.setDaemon(true);
    messageSenderThread.start();
}

public void destroy() {
    connections.clear();
    messageSender.stop();
    messageSender = null;
}

    /**
     * Process the given Comet event.
     * 
     * @param event
     *            The Comet event that will be processed
     * @throws IOException
     * @throws ServletException
     */
public void event(CometEvent event) throws IOException, ServletException {
    HttpServletRequest request = event.getHttpServletRequest();
    HttpServletResponse response = event.getHttpServletResponse();
    if (event.getEventType() == CometEvent.EventType.BEGIN) {
        log("Begin for session: " + request.getSession(true).getId());
        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.flush();
        synchronized (connections) {
            connections.add(response);
        }
    } else if (event.getEventType() == CometEvent.EventType.ERROR) {
        log("Error for session: " + request.getSession(true).getId());
        synchronized (connections) {
            connections.remove(response);
        }
        event.close();
    } else if (event.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>");
        event.close();
    } else if (event.getEventType() == CometEvent.EventType.READ) {
        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(event, request, response);
                System.out.println("you have an error");

                return;
            }
        } while (is.available() > 0);
    }
}
}

package controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import javax.servlet.http.HttpServletResponse;

public class MessageSender implements Runnable {

protected boolean running = true;
protected ArrayList<String> messages = new ArrayList<String>();
protected ArrayList<HttpServletResponse> connections = new ArrayList<HttpServletResponse>();

public MessageSender() {
}

public void stop() {
    running = false;
}

/**
 * Add message for sending.
 */
public void send(String user, String message) {
    synchronized (messages) {
        messages.add("[" + user + "]: " + message);
        messages.notify();
    }
}

public void run() {

    while (running) {

        if (messages.size() == 0) {
            try {
                synchronized (messages) {
                    messages.wait();
                }
            } catch (InterruptedException e) {
                // Ignore
            }
        }

        synchronized (connections) {
            String[] pendingMessages = null;
            synchronized (messages) {
                pendingMessages = messages.toArray(new String[0]);
                messages.clear();
            }
            // Send any pending message on all the open connections
            for (int i = 0; i < connections.size(); i++) {
                try {
                    PrintWriter writer = connections.get(i).getWriter();
                    for (int j = 0; j < pendingMessages.length; j++) {
                        writer.println(pendingMessages[j] + "<br>");
                    }
                    writer.flush();
                } catch (IOException e) {
                    System.out.println("IOExeption sending message" + e);
                }
            }
        }

    }

}

}

【问题讨论】:

    标签: ajax tomcat servlets comet server-push


    【解决方案1】:

    这里有一个完整的Tomcat示例,底部有源代码下载:Developing with Comet and Java

    【讨论】:

    • 您能否顺利完成该教程。我能够让 Comets 部分正常工作,但我没有获得天气数据,而是获得了应该调用 servlet 的 .jsp 页面,该页面在 HTTPResponse 对象中返回。
    • 我只测试了 TomcatWeatherServlet 并且它有效。你在使用 Eclipse 吗?我可以压缩项目并将其发送给您。
    • 是的,我正在使用 Eclipse,您能否给我发送电子邮件至 gmail dot com 的 ankurshardais - 非常感谢。
    • 好的,我会在星期一发送。
    • 嗨,你能把那个发过去吗?它真的会帮助我。干杯。
    猜你喜欢
    • 1970-01-01
    • 2017-06-09
    • 2011-07-11
    • 1970-01-01
    • 2023-02-08
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多