反向Ajax之基于IFrame的Comet

Tomcat提供了一种高级IO,可以实现Comet的功能。
Servlet需要实现 CometProcessor接口,并且设置Tomcat连接器为org.apache.coyote.http11.Http11NioProtocol

下面代码实现的功能还是获取服务器JVM信息。

  1. import java.io.IOException;
  2. import java.io.PrintWriter;
  3. import java.util.Date;
  4. import java.util.Queue;
  5. import java.util.concurrent.ConcurrentLinkedQueue;
  6. import java.util.concurrent.Executors;
  7. import java.util.concurrent.ScheduledExecutorService;
  8. import java.util.concurrent.TimeUnit;

  9. import javax.servlet.ServletException;
  10. import javax.servlet.annotation.WebServlet;
  11. import javax.servlet.http.HttpServlet;
  12. import javax.servlet.http.HttpServletRequest;
  13. import javax.servlet.http.HttpServletResponse;

  14. import org.apache.catalina.comet.CometEvent;
  15. import org.apache.catalina.comet.CometProcessor;

  16. @WebServlet(urlPatterns = { "/comet.do" })
  17. public class InitServlet extends HttpServlet implements CometProcessor, Runnable {
  18.     Queue<HttpServletResponse> queue = new ConcurrentLinkedQueue<HttpServletResponse>();

  19.     ScheduledExecutorService singleThread = Executors.newSingleThreadScheduledExecutor();
  20.     {
  21.         singleThread.scheduleWithFixedDelay(this, 3, 3, TimeUnit.SECONDS);
  22.     }

  23.     private String htmlEscape(String message) {
  24.         return "" + message.replaceAll("\n", "").replaceAll("\r", "") + "\");\n";
  25.     }

  26.     private String getJVMInfo() {
  27.         long useMemory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
  28.         useMemory = useMemory / 1024;
  29.         return "已用内存:" + String.valueOf(useMemory) + "K";
  30.     }

  31.     @Override
  32.     public void run() {
  33.         System.out.println("发送广播通知");
  34.         String data = "广播通知\n" + new Date() + "\n" + getJVMInfo();
  35.         for (HttpServletResponse response : queue) {
  36.             try {
  37.                 response.setContentType("text/html;charset=UTF-8");
  38.                 PrintWriter writer = response.getWriter();
  39.                 writer.println(htmlEscape(data));
  40.                 writer.flush();
  41.             } catch (IOException e) {
  42.                 queue.remove(response);
  43.                 e.printStackTrace();
  44.             }

  45.         }
  46.     }

  47.     @Override
  48.     public void event(CometEvent event) throws IOException, ServletException {
  49.         HttpServletRequest request = event.getHttpServletRequest();
  50.         HttpServletResponse response = event.getHttpServletResponse();

  51.         String name = request.getParameter("name");
  52.         if (event.getEventType() == CometEvent.EventType.BEGIN) {
  53.             event.setTimeout(Integer.MAX_VALUE);
  54.             queue.add(response);
  55.         } else if (event.getEventType() == CometEvent.EventType.ERROR) {
  56.             queue.remove(event);
  57.             event.close();
  58.         } else if (event.getEventType() == CometEvent.EventType.END) {
  59.             queue.remove(event);
  60.             event.close();
  61.         } else if (event.getEventType() == CometEvent.EventType.READ) {
  62.         }
  63.     }
  64. }
前台页面:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript"
    src="http://code.jquery.com/jquery-2.0.3.min.js"></script>
<script type="text/javascript">
    var connection = {
        iframe : false,
        server : 'comet.do',
        init : function() {
            connection.iframe = document.createElement('iframe');
            connection.iframe.setAttribute("id", "comet_iframe");
            with (connection.iframe.style) {
                left = top = "-100px";
                height = width = "1px";
                visibility = "hidden";
                display = 'none';
            }
            $('body').append(connection.iframe)
        },
        request : function() {
            var name = $('#name').val();
            connection.iframe.setAttribute("src", connection.server + '?name='
                    + name);
        },
        callback : function(data) {
            $('#content').html(data);
        }
    }

    $(document).ready(function() {
        connection.init();
    });
</script>
</head>
<body>
    <input type="text" id="name" />
    <input type="button" value="start" onclick="connection.request();" />
    <div id="content"></div>
</body>
</html>

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29254281/viewspace-1065449/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29254281/viewspace-1065449/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值