HTTP长连接实现“服务器推”的技术

HTTP长连接实现“服务器推”的技术快速入门及演示示例

在我的印象里HTTP是一种“无状态的协议”,也就是不知道以前请求的历史,无法保留上一次请求的结果。
Cookie的诞生,弥补了这个不足,浏览器可以通过本地持久化请求数据来记录上次请求的环境。但这个没有根本上改变HTTP请求本身的这种“客户端请求服务器端相应”模式——客户端是主动的,而服务器是被动的。
最近听说有“HTTP长连接”,去探索了一把,果然很有意思,能够实现“服务器推”的这种概念,也就是服务器是主动发送请求,客户端是被动接受请求。
关于“服务器推”及“HTTP长连接”的概念网上很多,给一个比较系统的介绍文章:
http://www.ibm.com/developerworks/cn/web/wa-lo-comet/

HTTP长连接这种把数据从服务器主动“推”到客户端的技术,能带来的好处不言而喻。它可以把最新的统计数据输出到客户端,也可以实现即时通讯。

下面是JSP实现的一个“监控服务器时间”程序的代码示例(片段)
1、web.xml

[html] view plaincopy

  1. <servlet>
  2. <servlet-name>ServerTimeMonitorServlet</servlet-name>
  3. <servlet-class>com.ebiz.test.ServerTimeMonitorServlet</servlet-class>
  4. <init-param>
  5. <param-name>interval</param-name>
  6. <param-value>1</param-value>
  7. </init-param>
  8. </servlet>
  9. <servlet-mapping>
  10. <servlet-name>ServerTimeMonitorServlet</servlet-name>
  11. <url-pattern>/ServerTimeMonitor</url-pattern>
  12. </servlet-mapping>

2、servlet:ServerTimeMonitorServlet.java

[java] view plaincopy

  1. package com.ebiz.test;
  2. import java.io.IOException;
  3. import java.text.SimpleDateFormat;
  4. import java.util.Date;
  5. import javax.servlet.ServletConfig;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.http.HttpServlet;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10. public class ServerTimeMonitorServlet extends HttpServlet {
  11. private static final long serialVersionUID = -3981794330055840248L;
  12. private String interval = "1";
  13. public void init(ServletConfig config) throws ServletException {
  14. this.interval = config.getInitParameter("interval");
  15. super.init();
  16. }
  17. public void destroy() {
  18. this.interval = null;
  19. super.destroy();
  20. }
  21. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
  22. java.io.IOException {
  23. for (int i = 0; i < 100; i++) {
  24. try {
  25. Thread.sleep(1000 * Integer.valueOf(interval));
  26. } catch (NumberFormatException e) {
  27. e.printStackTrace();
  28. } catch (InterruptedException e) {
  29. e.printStackTrace();
  30. }
  31. SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss E");
  32. String date_str = df.format(new Date());
  33. writerResponse(response, date_str, "showServerTime");// msg是test.jsp中的那个js方法的名称
  34. }
  35. return;
  36. }
  37. protected void writerResponse(HttpServletResponse response, String body, String client_method) throws IOException {
  38. StringBuffer sb = new StringBuffer();
  39. sb.append("<script type=\"text/javascript\">//<![CDATA[\n");
  40. sb.append("     parent.").append(client_method).append("(\"").append(body).append("\");\n");
  41. sb.append("//]]></script>");
  42. System.out.println(sb.toString());
  43. response.setContentType("text/html;charset=GBK");
  44. response.addHeader("Pragma", "no-cache");
  45. response.setHeader("Cache-Control", "no-cache,no-store,must-revalidate");
  46. response.setHeader("Cache-Control", "pre-check=0,post-check=0");
  47. response.setDateHeader("Expires", 0);
  48. response.getWriter().write(sb.toString());
  49. response.flushBuffer();
  50. }
  51. public String getInterval() {
  52. return interval;
  53. }
  54. public void setInterval(String interval) {
  55. this.interval = interval;
  56. }
  57. }

3、jsp:server-time-monitor.jsp

[html] view plaincopy

  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
  2. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  3. <c:set var="ctx" value="${pageContext.request[‘contextPath‘]}" />
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  5. <html xmlns="http://www.w3.org/1999/xhtml">
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  8. <title>HTTP 长连接测试 —— 监控服务器时间 </title>
  9. </head>
  10. <body>
  11. <div id="monitor-window">服务器现在是:<span id="time"></span></div>
  12. <form id="a-form" action="${ctx}/ServerTimeMonitor" method="post" target="handleFrame">
  13. <input type="submit" name="submit" id="submit" value=" 获取并监控服务器时间 " />
  14. </form>
  15. <iframe name="handleFrame" id="handleFrame" style="display:none"></iframe>
  16. <!-- <script type="text/javascript" src="http://code.jquery.com/jquery-1.10.2.min.js"></script> -->
  17. <script type="text/javascript" src="jquery-1.10.2.min.js"></script>
  18. <script type="text/javascript">//<![CDATA[
  19. function showServerTime(msg) {
  20. $("#time").html(msg);
  21. }
  22. //]]></script>
  23. </body>
  24. </html>

执行过程

仔细看JSP这段HTML代码,很有意思。

1、form通过POST请求把返回的Script代码输出到iframe中(form的target="handleFrame")。这段返回的Script代码在服务器的控制台输出如下:

[javascript] view plaincopy

  1. <script type="text/javascript">//<![CDATA[
  2. parent.showServerTime("2013-08-17 12:08:14 星期六");
  3. //]]></script>

2、iframe完成加载上面这段代码后解析并执行,这段代码的作用是调用父页面的“showServerTime”方法,把消息传入。

3、父页面showServerTime函数负责处理接收到的消息。

4、Servlet负责定时执行和输出,源源不断向客户端发送内容。

原来,这个隐藏的iframe起到了一个“纽带”的作用。

演示结果

测试结果

在Chrome中标题前面有一个正在加载的图标,感觉上页面一直在加载,IE9中没有这个现象,其他浏览器没有测试。

(完)

时间: 2024-12-08 23:30:05

HTTP长连接实现“服务器推”的技术的相关文章

Comet:基于 HTTP 长连接的“服务器推”技术

“服务器推”技术的应用 传统模式的 Web 系统以客户端发出请求.服务器端响应的方式工作.这种方式并不能满足很多现实应用的需求,譬如: 监控系统:后台硬件热插拔.LED.温度.电压发生变化: 即时通信系统:其它用户登录.发送信息: 即时报价系统:后台数据库内容发生变化: 这些应用都需要服务器能实时地将更新的信息传送到客户端,而无须客户端发出请求.“服务器推”技术在现实应用中有一些解决方案,本文将这些解决方案分为两类:一类需要在浏览器端安装插件,基于套接口传送信息,或是使用 RMI.CORBA 进

【转】Comet:基于 HTTP 长连接的“服务器推”技术

原文链接:http://www.ibm.com/developerworks/cn/web/wa-lo-comet/ 很多应用譬如监控.即时通信.即时报价系统都需要将后台发生的变化实时传送到客户端而无须客户端不停地刷新.发送请求.本文首先介绍.比较了常用的“服务器推”方案,着重介绍了 Comet - 使用 HTTP 长连接.无须浏览器安装插件的两种“服务器推”方案:基于 AJAX 的长轮询方式:基于 iframe 及 htmlfile 的流方式.最后分析了开发 Comet 应用需要注意的一些问题

comet(基于http长连接的“服务器推”技术)

comet(基于http长连接的“服务器推”技术)web服务器是被动发送数据给客户端的,客户端有请求,服务器端才会响应(发送数据),所以“服务器推”技术加了引号.实现方式有两个:1.基于ajax的长轮询(long-polling)方式 浏览器发送ajax请求(设置timeout,并且对返回的状态进行处理, 猜想:设置了timeout,connection:keep-alive就会加入到请求头中,即基于http长连接), 如果到了时间,http连接断了(底层是tcp连接断了)则重新发起请求.2.基

转载:Comet:基于 HTTP 长连接的“服务器推”技术

转自:http://www.ibm.com/developerworks/cn/web/wa-lo-comet/ 很多应用譬如监控.即时通信.即时报价系统都需要将后台发生的变化实时传送到客户端而无须客户端不停地刷新.发送请求.本文首先介绍.比较了常用的“服务器推”方案,着重介绍了 Comet - 使用 HTTP 长连接.无须浏览器安装插件的两种“服务器推”方案:基于 AJAX 的长轮询方式:基于 iframe 及 htmlfile 的流方式.最后分析了开发 Comet 应用需要注意的一些问题,以

[转载] Comet:基于 HTTP 长连接的“服务器推”技术

转载自http://www.ibm.com/developerworks/cn/web/wa-lo-comet/ “服务器推”技术的应用 传统模式的 Web 系统以客户端发出请求.服务器端响应的方式工作.这种方式并不能满足很多现实应用的需求,譬如: 监控系统:后台硬件热插拔.LED.温度.电压发生变化: 即时通信系统:其它用户登录.发送信息: 即时报价系统:后台数据库内容发生变化: 这些应用都需要服务器能实时地将更新的信息传送到客户端,而无须客户端发出请求.“服务器推”技术在现实应用中有一些解决

Android 心跳包心跳连接 如何实现android和服务器长连接呢?推送消息的原理

前言:现在的大多数移动端应用都有实时得到消息的能力,简单来说,有发送消息的主动权和接受消息的被动权.例如:微信,QQ,天气预报等等,相信好处和用户体验相信大家都知道吧. 提出问题:这种功能必须涉及client(客户端)和server(服务器),所以到底client如何和server实现实时连接通讯? 分析问题:这种功能实际上就是数据同步,同时要考虑手机本身.电量.网络流量等等限制因素,所以通常在移动端上有一下两个解决方案:1.一种是定时去server查询数据,通常是使用HTTP协议来访问web服

基于comet服务器推送技术(web实时聊天)

http://www.cnblogs.com/zengqinglei/archive/2013/03/31/2991189.html Comet 也称反向 Ajax 或服务器端推技术.其思想很简单:将数据直接从服务器推到浏览器,而不必等到浏览器请求数据. 主要思想:服务器端将数据推送到客户端(浏览器) 本人做了简单的web实时聊天系统:服务器推送(聊天).zip 系统简单说明如下: { 系统所用数据库:sqlite数据库 UserInfo:用户信息表 UserRelation:用户关系表 Mes

Web端服务器推送技术原理分析

1 背景 "服务器推送技术"(ServerPushing)是最近Web技术中最热门的一个流行术语.它是继"Ajax"之后又一个倍受追捧的Web技术."服务器推送技术"最近的流行跟"Ajax "有着密切的关系. 随着 Ajax技术的兴起,让广大开发人员又一次看到了使用浏览器来替代桌面应用的机会,并且这次机会非常大.Ajax将整个页面的刷新变成页面局部的刷新,并且数据的传送是以异步方式进行,这使得网络延迟带来的视觉差异将会消失.

Web端服务器推送技术原理分析及dwr框架简单的使用

1 背景 “服务器推送技术”(ServerPushing)是最近Web技术中最热门的一个流行术语.它是继“Ajax”之后又一个倍受追捧的Web技术.“服务器推送技术”最近的流行跟“Ajax ”有着密切的关系. 随着 Ajax技术的兴起,让广大开发人员又一次看到了使用浏览器来替代桌面应用的机会,并且这次机会非常大.Ajax将整个页面的刷新变成页面局部的刷新,并且数据的传送是以异步方式进行,这使得网络延迟带来的视觉差异将会消失. 但是,在浏览器中的 Ajax应用中存在一个致命的缺陷无法满足传统桌面系