一、什么事Http长连接:在网上有很多很多关于Http长连接的文章,但是我看了很多都看不懂。自己总结的所谓的http长连接就是在一请求一个页面后,在服务器端不断开http连接,而是通过response一直在定时的往页面客户端刷新数据。

二、servlet编写

package servlet;import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.concurrent.TimeUnit;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class TestServlet extends HttpServlet {private static final long serialVersionUID = 1L;Long currTime = null;SimpleDateFormat sdf = null;public void init() throws ServletException {// 初始化一些参数super.init();currTime = System.currentTimeMillis();sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");}public void destroy() {super.destroy();}public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 在get中直接调用doPost方法doPost(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 长连接方式boolean flag = true;// 用来表示长连接是否已经被断开(如果数据发送失败了就说明是断开了)while (true) {flag = this.sendData("jsFun", sdf.format(currTime), response);currTime = System.currentTimeMillis();if (!flag) {// 如果数据发送失败,那么就退出了,说明页面长连接已经断开了break;}try {// 每5秒发送一次TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}}}/*** @Title: sendData* @Description: 用来定时向客户端返回数据* @param jsFun要调用的js函数* @param data要发送的数据* @param response*/private boolean sendData(String jsFun, String data,HttpServletResponse response) {try {response.setContentType("text/html;charset=utf-8");/* 这句话比较重要,我们通过response给页面返回一个js脚本,让js执行父页面的对应的jsFun,参数就是我们的data */response.getWriter().write("<script type=\"text/javascript\">parent." + jsFun + "(\""+ data + "\")</script>");response.flushBuffer();return true;} catch (Exception e) {System.err.println("long connection was broken!");return false;}}}

三、页面编写

<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script type="text/javascript"src="http://cdn.hcharts.cn/jquery/jquery-1.8.3.min.js"></script>
<title>测试页面</title>
</head>
<body><!-- 定义一个form表单, 重要的是target="myiframe",这里把form的请求定向到了myiframe中,然后再myiframe中执行servlet中返回的脚本,调用myiframe的父页面的jsFun,也就是本页面的jsFun --><form action="" method="post" id="myForm" target="myiframe"></form><!-- iframe要隐藏哦 --><iframe id="myiframe" name="myiframe" style="display: none;"></iframe><div id="container" style="height: 800px"></div></body><script type="text/javascript">function jsFun(data) {//一直被后台调用的方法$('#container').append("<br/>");$('#container').append(data);}function init() {//用户进入页面后就自动发起form表单的提交,激活长连接var action = "${pageContext.request.contextPath}/servlet/TestServlet";$('#myForm').attr("action", action);$('#myForm').submit();}
</script><script type="text/javascript">$(function() {init();});
</script>
</html>

四、通过tomcat启动项目,查看运行结果


可以看到数据是每隔5条打印一次的,而且浏览器的页面一直在转圈圈,这就是http长连接的标志。

五、当页面断开连接的时候(刷新页面或关闭页面)

可以看到服务器会自动断开连接,避免资源的浪费。

Http长连接的例子_亲测可用哦相关推荐

  1. 苹果ios 11系统无法连接服务器,ios11 App Store无法连接解决办法,亲测可用

    原标题:ios11 App Store无法连接解决办法,亲测可用 之前咱们公众号:果粉之家曾多次介绍过IOS11的新功能,包括:加入蜂窝数据开关,可自定义控制中心,支持屏幕录像,支持GIF动图,可以设 ...

  2. python连接网络服务器,亲测可用,到此一游

    早上想到了一个小项目,服务器监测数据,用了一天时间,用Python成功连接了网络服务器,说下真实体会,服务器购买的是腾讯云,价格还算亲民,100多米一年,就是硬盘空间小了些,速度还可以.今天也算我第一 ...

  3. 2023全新纯净版本知识付费微信小程序源码_附搭建教程_亲测可用

    介绍: 主要功能 会员系统,用户登录/注册购买记录 收藏记录 基本设置 后台控制导航颜色 字体颜色 标题等设置 流量主广告开关小程序广告显示隐藏 广告主审核过审核 资源管理 后台可以添加5种类型资源灵 ...

  4. AndroidStudio_安卓原生开发_apk在线升级_实现安装未知来源应用_亲测可用---Android原生开发工作笔记153

    1.网上找了一些,不是不好用,就是差点东西...所以自己做了一个可用的,以后备用 首先先看代码吧,直接复制就可以使用 在一个按钮事件中,写入一个方法来检查版本 checkVersion(); priv ...

  5. Linux上安装和使用git到gitoschina和github上_亲测

    Linux上安装和使用git到gitoschina和github上_亲测 git介绍与在linux上安装 创建SSHkey 在git-oschina使用 maven-oschina使用 在github ...

  6. Matlab和stk通过connector连接,win7下亲测好用

    Matlab和stk通过connector连接,win7下亲测好用 资源下载 测试用例 资源下载 https://download.csdn.net/download/weixin_43496847/ ...

  7. Linux安装svn服务器和权限配置_亲测成功

    Linux安装svn服务器和权限配置_亲测成功 SVN简介 SVN是Subversion的简称,是一个开放源代码的版本控制系统,通过采用分支管理系统的高效管理,简而言之就是用于多个人共同开发同一个项目 ...

  8. grafana graphite statsd搭建安装部署 实时监控_亲测成功

    grafana graphite statsd搭建安装部署 实时监控_亲测成功 docker部署grafana graphite stastd实时监控告警配置_亲测成功 下载软件 # 下载carbon ...

  9. win7共享xp打印机_快速有效的局域网共享方法,十年老技术现身说法亲测可用

    说到局域网共享,办公室一族或者有多台电脑的场合,经常会用到,网络上教程也有很多,但大都设置繁琐,效果并不理想.今天,我们拿出多年一线工作的实战经验,为大家提炼出简单.快速.有效的局域网共享方法,绝对亲 ...

最新文章

  1. python【数据结构与算法】最小生成树之Kruskal算法
  2. Spark Job Scheduling
  3. 《ASCE1885的源码分析》の简单的进程封装类
  4. 怕忘记了。记录一下要采购的元件----1
  5. JavaWeb从入门到精通 二
  6. anaconda利用sns或plt画图中文乱码问题
  7. sas 安装后处理出错
  8. React Native多语言切换
  9. ruby 安装bundler的方法
  10. s5p6818/fs4418系统移植之uboot的移植
  11. springboot DataSource
  12. Java并发编程:volatile关键字解析 by 海子
  13. 学习JS的这些日子——十二月总结
  14. IBM小型机更换硬盘详细步骤
  15. 英语谚语大全(3267条)
  16. RF-测试中常用函数
  17. 球形/PH响应性的树枝状聚合物:树枝状聚酰胺PAMAM/His-PAMAM/DNA 聚酰胺偶联组氨酸/的制备流程
  18. 【智能产品方案】智能跳绳方案开发
  19. Air Quality Index,简称AQI
  20. 国标GB28181协议视频监控平台EasyGBS设备播放断流现象的排查分析及解决

热门文章

  1. mysql获取最好成绩对应数据的其他项_开源数据同步神器——canal
  2. 香蜜台词共赴鸿蒙,香蜜台词斗法
  3. 生产调度java程序原码_Rxjava的线程调度源码解析
  4. Connection to @localhost failed. [08001] Could not create connection to database server. Attempt
  5. Java中锁的使用和实现
  6. 职称计算机考试word2003真题,职称计算机考试《Word2003》历年真题回顾(1)
  7. pads中如何设置等长_如何在SQL Server中设置扩展,监控系统性能
  8. python docker_Docker实践:python应用容器化
  9. delphi if多个条件_判断(if)语句
  10. java 连接mysql工具类_java连接Mysql数据库的工具类