HTTP长连接实现“服务器推”的技术
Cookie的诞生,弥补了这个不足,浏览器可以通过本地持久化请求数据来记录上次请求的环境。但这个没有根本上改变HTTP请求本身的这种“客户端请求服务器端相应”模式——客户端是主动的,而服务器是被动的。
最近听说有“HTTP长连接”,去探索了一把,果然很有意思,能够实现“服务器推”的这种概念,也就是服务器是主动发送请求,客户端是被动接受请求。
关于“服务器推”及“HTTP长连接”的概念网上很多,给一个比较系统的介绍文章:
http://www.ibm.com/developerworks/cn/web/wa-lo-comet/
HTTP长连接这种把数据从服务器主动“推”到客户端的技术,能带来的好处不言而喻。它可以把最新的统计数据输出到客户端,也可以实现即时通讯。
下面是JSP实现的一个“监控服务器时间”程序的代码示例(片段)
1、web.xml
- <servlet>
- <servlet-name>ServerTimeMonitorServlet</servlet-name>
- <servlet-class>com.ebiz.test.ServerTimeMonitorServlet</servlet-class>
- <init-param>
- <param-name>interval</param-name>
- <param-value>1</param-value>
- </init-param>
- </servlet>
- <servlet-mapping>
- <servlet-name>ServerTimeMonitorServlet</servlet-name>
- <url-pattern>/ServerTimeMonitor</url-pattern>
- </servlet-mapping>
2、servlet:ServerTimeMonitorServlet.java
- package com.ebiz.test;
- import java.io.IOException;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import javax.servlet.ServletConfig;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class ServerTimeMonitorServlet extends HttpServlet {
- private static final long serialVersionUID = -3981794330055840248L;
- private String interval = "1";
- public void init(ServletConfig config) throws ServletException {
- this.interval = config.getInitParameter("interval");
- super.init();
- }
- public void destroy() {
- this.interval = null;
- super.destroy();
- }
- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
- java.io.IOException {
- for (int i = 0; i < 100; i++) {
- try {
- Thread.sleep(1000 * Integer.valueOf(interval));
- } catch (NumberFormatException e) {
- e.printStackTrace();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss E");
- String date_str = df.format(new Date());
- writerResponse(response, date_str, "showServerTime");// msg是test.jsp中的那个js方法的名称
- }
- return;
- }
- protected void writerResponse(HttpServletResponse response, String body, String client_method) throws IOException {
- StringBuffer sb = new StringBuffer();
- sb.append("<script type=\"text/javascript\">//<![CDATA[\n");
- sb.append(" parent.").append(client_method).append("(\"").append(body).append("\");\n");
- sb.append("//]]></script>");
- System.out.println(sb.toString());
- response.setContentType("text/html;charset=GBK");
- response.addHeader("Pragma", "no-cache");
- response.setHeader("Cache-Control", "no-cache,no-store,must-revalidate");
- response.setHeader("Cache-Control", "pre-check=0,post-check=0");
- response.setDateHeader("Expires", 0);
- response.getWriter().write(sb.toString());
- response.flushBuffer();
- }
- public String getInterval() {
- return interval;
- }
- public void setInterval(String interval) {
- this.interval = interval;
- }
- }
3、jsp:server-time-monitor.jsp
- <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
- <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
- <c:set var="ctx" value="${pageContext.request['contextPath']}" />
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>HTTP 长连接测试 —— 监控服务器时间 </title>
- </head>
- <body>
- <div id="monitor-window">服务器现在是:<span id="time"></span></div>
- <form id="a-form" action="${ctx}/ServerTimeMonitor" method="post" target="handleFrame">
- <input type="submit" name="submit" id="submit" value=" 获取并监控服务器时间 " />
- </form>
- <iframe name="handleFrame" id="handleFrame" style="display:none"></iframe>
- <!-- <script type="text/javascript" src="http://code.jquery.com/jquery-1.10.2.min.js"></script> -->
- <script type="text/javascript" src="jquery-1.10.2.min.js"></script>
- <script type="text/javascript">//<![CDATA[
- function showServerTime(msg) {
- $("#time").html(msg);
- }
- //]]></script>
- </body>
- </html>
执行过程
仔细看JSP这段HTML代码,很有意思。
1、form通过POST请求把返回的Script代码输出到iframe中(form的target="handleFrame")。这段返回的Script代码在服务器的控制台输出如下:
- <script type="text/javascript">//<![CDATA[
- parent.showServerTime("2013-08-17 12:08:14 星期六");
- //]]></script>
2、iframe完成加载上面这段代码后解析并执行,这段代码的作用是调用父页面的“showServerTime”方法,把消息传入。
3、父页面showServerTime函数负责处理接收到的消息。
4、Servlet负责定时执行和输出,源源不断向客户端发送内容。
原来,这个隐藏的iframe起到了一个“纽带”的作用。
演示结果
测试结果
在Chrome中标题前面有一个正在加载的图标,感觉上页面一直在加载,IE9中没有这个现象,其他浏览器没有测试。
(完)
HTTP长连接实现“服务器推”的技术的更多相关文章
- Comet:基于 HTTP 长连接的“服务器推”技术
“服务器推”技术的应用 请访问 Ajax 技术资源中心,这是有关 Ajax 编程模型信息的一站式中心,包括很多文档.教程.论坛.blog.wiki 和新闻.任何 Ajax 的新信息都能在这里找到. c ...
- 转载:Comet:基于 HTTP 长连接的“服务器推”技术
转自:http://www.ibm.com/developerworks/cn/web/wa-lo-comet/ 很多应用譬如监控.即时通信.即时报价系统都需要将后台发生的变化实时传送到客户端而无须客 ...
- [转载] Comet:基于 HTTP 长连接的“服务器推”技术
转载自http://www.ibm.com/developerworks/cn/web/wa-lo-comet/ “服务器推”技术的应用 传统模式的 Web 系统以客户端发出请求.服务器端响应的方式工 ...
- Comet:基于 HTTP 长连接的“服务器推”技术(转载)
“服务器推”技术的应用 传统模式的 Web 系统以客户端发出请求.服务器端响应的方式工作.这种方式并不能满足很多现实应用的需求,譬如: 监控系统:后台硬件热插拔.LED.温度.电压发生变化: 即时通信 ...
- 【转】Comet:基于 HTTP 长连接的“服务器推”技术
原文链接:http://www.ibm.com/developerworks/cn/web/wa-lo-comet/ 很多应用譬如监控.即时通信.即时报价系统都需要将后台发生的变化实时传送到客户端而无 ...
- Comet:基于 HTTP 长连接的“服务器推”技术解析
原文链接:http://www.cnblogs.com/deepleo/p/Comet.html 一.背景介绍 传统web请求,是显式的向服务器发送http Request,拿到Response后显示 ...
- ASP.NET MVC 长连接(服务器推)完整实现
1.什么是"服务器推"(百科来一波)? 传统模式的 Web 系统以客户端发出请求.服务器端响应的方式工作.这种方式并不能满足很多现实应用的需求,譬如: 监控系统:后台硬件热插拔.L ...
- Android 心跳包心跳连接 如何实现android和服务器长连接呢?推送消息的原理
前言:现在的大多数移动端应用都有实时得到消息的能力,简单来说,有发送消息的主动权和接受消息的被动权.例如:微信,QQ,天气预报等等,相信好处和用户体验相信大家都知道吧. 提出问题:这种功能必须涉及cl ...
- Web端服务器推送技术原理分析及dwr框架简单的使用
1 背景 “服务器推送技术”(ServerPushing)是最近Web技术中最热门的一个流行术语.它是继“Ajax”之后又一个倍受追捧的Web技术.“服务器推送技术”最近的流行跟“Ajax ”有着密切 ...
随机推荐
- div+css遮罩层
曾被问到这个问题,不知所措,后来在网上找到了.大神文章:http://www.cnblogs.com/aspx-net/archive/2011/03/11/1981071.html 我想实现的效果没 ...
- WPF 在画布中布局N行N列的实现方法
最近写一个WPF项目,中间有一个实现在画布中排列的问题(整齐摆列几行几列的算法).本人逻辑有点差啊,废了老大功夫才实现,也没啥就牛逼的,就是拿出来分享一下,给需要的同学节省点时间,如果有用的话别忘赞一 ...
- 鼠标驱动之-sys节点-input子系统
首先需要了解sys节点和linux驱动编程的知识,在linux内核<linux/>下有着对应的实现.本例实现创建sys节点,外围程序通过input子系统控制鼠标位置. 第一步编写驱动代码, ...
- centos 6.5安装vncserver 并开启远程桌面
vnc是一款使用广泛的服务器管理软件,可以实现图形化管理,下面简单介绍一下如何在centos6.5下安装vnc. 1.下载vncserver yum install tigervnc tige ...
- nginx——内存池篇
nginx--内存池篇 一.内存池概述 内存池是在真正使用内存之前,预先申请分配一定数量的.大小相等(一般情况下)的内存块留作备用.当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续 ...
- xk01创建供应商保存的时候,提示错误“科目800001已经存在”
解决方法:
- Javascript数据类型之Undefined和null
Javascrip中的数据类型分为原始数据类型(primitive type)和对象数据类型(object type). 原始数据类型 原始数据类型包括:数字.字符串.布尔值.null.undefin ...
- sed 详解
sed 详解 1.简介 sed是非交互式的编辑器.它不会修改文件,除非使用shell重定向来保存结果.默认情况下,所有的输出行都被打印到屏幕上. sed编辑器逐行处理文件(或输入),并将结果发送到屏幕 ...
- ios 框架学习笔记
ios主要的系统层次: 一.Cocoa Touch 层:创建应用程序主要使用的框架. 1.关键技术: AirDrop:实现应用间通信. Text Kit:处理文本和排版. UIKit Dynamics ...
- 虚拟机移动后重启网络时提示Device does not seem to be present
Wmware虚拟机硬盘文件位置移动之后,重新引入到Wmware workStation中, 通过命令ifconfig...没有看到eth0..然后重启网卡 #service network resta ...