rule 发表于 2017-1-25 13:26:04

Tomcat 6支持的Comet

  今天在测试中无意中看到Tomcat 6的新特性Comet,使用Comet技术可以轻松实现一个Pushlet的功能,让我看了着实兴奋不已,而其官方网站还给出了一个Messenger的例子。


[*]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;
[*]            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);
[*]                  return;
[*]                }
[*]            } while (is.available() > 0);
[*]      }
[*]    }
[*] 
[*]    public class MessageSender implements Runnable {
[*] 
[*]      protected boolean running = true;
[*]      protected ArrayList<String> messages = new ArrayList<String>();
[*]
[*]      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);
[*]                        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 + "<br>");
[*]                            }
[*]                            writer.flush();
[*]                        } catch (IOException e) {
[*]                            log("IOExeption sending message", e);
[*]                        }
[*]                  }
[*]                }
[*] 
[*]            }
[*] 
[*]      }
[*] 
[*]    }
[*] 
[*]}
页: [1]
查看完整版本: Tomcat 6支持的Comet