Ajax 如何从网页调用此Comets应用程序

Ajax 如何从网页调用此Comets应用程序,ajax,tomcat,servlets,comet,server-push,Ajax,Tomcat,Servlets,Comet,Server Push,我已经实现了上面显示的两个类,它们使用Tomcat的comet实现提供了一个messenger应用程序 如何将其连接到web界面并获得要显示的内容 我认为这些是基本步骤(我不知道细节) 我应该创建一些传统事件——按钮单击或AJAX事件——调用ChatServlet并以某种方式传入CometEvent(可能是开始) 从那时起,每当我想使用READ事件作为输入参数向客户机发送内容时,我的代码都会调用event方法 我复制了以下两个类: 包装控制器; 导入java.io.IOException; 导

我已经实现了上面显示的两个类,它们使用Tomcat的comet实现提供了一个messenger应用程序

如何将其连接到web界面并获得要显示的内容

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

  • 我应该创建一些传统事件——按钮单击或AJAX事件——调用ChatServlet并以某种方式传入CometEvent(可能是开始)
  • 从那时起,每当我想使用READ事件作为输入参数向客户机发送内容时,我的代码都会调用event方法
  • 我复制了以下两个类:


    包装控制器;
    导入java.io.IOException;
    导入java.io.InputStream;
    导入java.io.PrintWriter;
    导入java.util.ArrayList;
    导入javax.servlet.ServletException;
    导入javax.servlet.http.HttpServlet;
    导入javax.servlet.http.HttpServletRequest;
    导入javax.servlet.http.HttpServletResponse;
    导入org.apache.catalina.CometEvent;
    导入org.apache.catalina.com处理器;
    公共类ChatServlet扩展了HttpServlet处理器{
    受保护的ArrayList连接=新建ArrayList();
    受保护的MessageSender=null;
    public void init()引发ServletException{
    messageSender=新建messageSender();
    线程messageSenderThread=新线程(messageSender,“messageSender[”
    +getServletContext().getContextPath()+“]”;
    messageSenderThread.setDaemon(true);
    messageSenderThread.start();
    }
    公共空间销毁(){
    连接。清除();
    messageSender.stop();
    messageSender=null;
    }
    /**
    *处理给定的Comet事件。
    * 
    *@param事件
    *将要处理的Comet事件
    *@抛出异常
    *@ServletException
    */
    公共无效事件(CometEvent事件)引发IOException、ServletException{
    HttpServletRequest=event.getHttpServletRequest();
    HttpServletResponse=event.getHttpServletResponse();
    if(event.getEventType()==CometEvent.EventType.BEGIN){
    日志(“开始会话:+request.getSession(true.getId());
    PrintWriter=response.getWriter();
    作家
    .println(“”);
    作家
    .println(“JSP聊天”);
    writer.flush();
    已同步(连接){
    连接。添加(响应);
    }
    }else if(event.getEventType()==CometEvent.EventType.ERROR){
    日志(“会话错误:+request.getSession(true.getId());
    已同步(连接){
    连接。移除(响应);
    }
    event.close();
    }else if(event.getEventType()==CometEvent.EventType.END){
    日志(“会话结束:+request.getSession(true.getId());
    已同步(连接){
    连接。移除(响应);
    }
    PrintWriter=response.getWriter();
    writer.println(“”);
    event.close();
    }else if(event.getEventType()==CometEvent.EventType.READ){
    InputStream=request.getInputStream();
    字节[]buf=新字节[512];
    做{
    int n=is.read(buf);//可以引发IOException
    如果(n>0){
    日志(“读取”+n+”字节:“+新字符串(buf,0,n)
    +“对于会话:”
    +request.getSession(true.getId());
    }else if(n<0){
    //错误(事件、请求、响应);
    System.out.println(“您有一个错误”);
    返回;
    }
    }而(is.available()>0);
    }
    }
    }
    

    包装控制器;
    导入java.io.IOException;
    导入java.io.PrintWriter;
    导入java.util.ArrayList;
    导入javax.servlet.http.HttpServletResponse;
    公共类MessageSender实现可运行{
    受保护的布尔运行=真;
    受保护的ArrayList消息=新建ArrayList();
    受保护的ArrayList连接=新建ArrayList();
    公共消息发送者(){
    }
    公共停车场(){
    运行=错误;
    }
    /**
    *添加用于发送的消息。
    */
    公共无效发送(字符串用户、字符串消息){
    已同步(消息){
    消息。添加(“[”+用户+”]:“+消息);
    messages.notify();
    }
    }
    公开募捐{
    (跑步时){
    if(messages.size()==0){
    试一试{
    已同步(消息){
    messages.wait();
    }
    }捕捉(中断异常e){
    //忽略
    }
    }
    已同步(连接){
    字符串[]pendingMessages=null;
    已同步(消息){
    pendingMessages=messages.toArray(新字符串[0]);
    messages.clear();
    }
    //在所有打开的连接上发送任何挂起的消息
    对于(int i=0;i”);
    }
    writer.flush();
    }捕获(IOE异常){
    System.out.println(“IOEXECTION发送消息”+e);
    }
    }
    }
    }
    }
    }
    


    这里有一个完整的Tomcat示例,可在底部下载源代码:

    您是否能够顺利完成该教程。我能够让Comets部分工作,但我没有得到天气数据,而是得到了.jsp页面,该页面应该调用servlet,并在HTTPResponse对象中返回。我只测试了TomcatWeatherServlet,它工作了。您正在使用Eclipse吗?我可以将项目压缩并发送给您。是的,我正在使用Eclipse,您可以通过gmail.com给我发送电子邮件ankurshardais吗?非常感谢
    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);
                    }
                }
            }
    
        }
    
    }
    
    }