Http长连接的例子_亲测可用哦

一、什么事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://www.mzph.cn/news/569258.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不同操作系统上DNS客户端操作区别汇总

结论&#xff1a;windows有DNS缓存&#xff0c;Linux默认无DNS缓存&#xff0c;只能依赖于安装其他软件。 一、不同操作系统的客户端的DNS缓存差别 1、windows 系统中dns 解析器会使用系统的dns缓存来提高dns域名解析效率。 例如&#xff1a; 查看当前的dns cache内容&#xff…

SLAM学习心得——建图

1.建图 我们所谓的地图&#xff0c;即所有路标点的集合。一旦我们确定了路标点的位置&#xff0c;那就可以说我们完成了建图。 地图的作用&#xff1a;&#xff08;1&#xff09;定位 &#xff1b;&#xff08;2&#xff09;导航&#xff1b; &#xff08;3&#xff09;避障&am…

spark2

特点 通用 批处理 迭代式计算 交互查询 流处理 组件 spark core:任务调度 内存管理 容错机制 内部定义了RDDs 提供了很多API &#xff0c;为其他组件提供底层的服务 spark sql&#xff1a;报表统计 streaming :从kafka接收数据做实时统计 mlib&#xff1a;mll 支持横向扩展&am…

Oracle数据库----视图

--创建简单视图--建立用于查询员工号、姓名、工资的视图。create view emp_viewasselect empno,ename,sal from emp; --查询视图select * from emp_view; --创建视图时指定视图的列的别名create view emp_view2(员工号,姓名,工资)asselect empno,ename,sal from emp; --查询视图…

flume通过tcp/udp采集数据并存到kafka配置及操作方式

/*官方提供的kafka sink*/a1.sinks.k1.channel c1a1.sinks.k1.type org.apache.flume.sink.kafka.KafkaSinka1.sinks.k1.kafka.topic mytopica1.sinks.k1.kafka.bootstrap.servers localhost:9092a1.sinks.k1.kafka.flumeBatchSize 20a1.sinks.k1.kafka.producer.acks 1a…

一、免费API调用

一、免费API调用&#xff1a; 免费天气api接口 JS调用示例 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"…

spark 监控--WebUi、Metrics System(转载)

转载自&#xff1a;https://www.cnblogs.com/barrenlake/p/4364644.html Spark 监控相关的部分有WebUi 及 Metrics System; WebUi用于展示Spark 资源状态、Metrics System 整合的指标信息。 Ui相关流程 Spark集群启动之后&#xff0c;我们可以通过Web观察集群状态等信息&#x…

js中使用shiro标签的一个小坑

在jsp页面中使用shiro标签很简单 <shiro:haspermission name"你的权限"> 你的标签 </shiro:haspermission> 这样就可以把标签加上权限了。 但是有时候你的标签是js动态生成的&#xff0c;就像下面的例子&#xff1a; <script type"text/java…

求1-100数字的和

function sum_all(){var result 0;for(var i0;i<100;i){resultresulti;}return result; } var s sum_all(100); console.log(s);// while循环 function sum_all(){var result 0;var i0;while(i<100){i;resultresulti;}return result; } //do while语句 function sum_al…

微信开发--自定义菜单

一、定义几个实体类 public class AccessToken {//这里定义一个AccessToken的实体类&#xff0c;用来保存获取到的accesstokenprivate String token;//获得到的tokenprivate int expireIn;//过期时间public String getToken() {return token;}public void setToken(String toke…

.Net框架理论

.NET框架 .NET Framework是该平台的第一个也是最早的实现。它包括三个主要的应用程序模型 - WPF&#xff0c;Windows窗体&#xff0c;ASP.NET窗体 - 和基类库。 Windows Presentation Foundation&#xff08;WPF&#xff09;是一个UI框架&#xff0c;用于主要为Windows操作系统…

zkCli使用手册

zkClient命令笔记connect host:port 连接到其他的zk服务器&#xff0c;例&#xff1a;connect 192.168.174.222:2181-------------------------------------------------------------------------------------------------------get path [watch] 获取某个节点的数据&#xff0…

浏览器解析JavaScript的原理

JavaScript的特点一般都知道的就是解释执行&#xff0c;逐行执行&#xff0c;就是从上到下依次执行。 JavaScript的执行之前&#xff0c;其实还是有一些操作的&#xff0c;只是没有表现出来 JavaScript的执行过程&#xff1a; 1、语法检测  首先是大致查看有没有基本的语法错…

实现 tomcat 热加载证书

原文地址&#xff1a;https://my.oschina.net/u/157514/blog/395238 之前一篇中说了如何 建立 https 通信的完整流程&#xff0c;其中涉及了java web容器 tomcat&#xff0c;关于它的配置是&#xff1a; <Connector port"8443" protocol"org.apache.coyote.…

修改yapf中的列宽限制值

yapf是一款由Google开源的Python代码自动格式化工具&#xff0c;它根据PEP 8规范可以帮我们自动格式化我们的代码&#xff0c;让代码更规范、更漂亮。但是其中最大列宽被限制为80&#xff0c;如果超过80&#xff0c;在格式化时就会被yapf换行&#xff0c;随着现在人们的显示器越…

Hadoop64位版本安装后遇到的警告处理

在使用hadoop的过程中&#xff0c;会遇到一个警告&#xff0c;内容如下&#xff1a; WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 对于这个问题网上很多说法是由于系统位数和所下载…

【转】C++类的sizeof大小

转自https://blog.csdn.net/zhengjihao/article/details/77825269 其中有的描述与实际GCC上执行的结果不符&#xff0c;不过其中的分析思路需要掌握。 以下是GCC的实际执行结果&#xff1a; 1 #include <iostream>2 using namespace std;3 4 int *pointer;5 6 class Null…

shiro扩展获得用户登录类型并提供cookie的方式记住用户密码

在最近的项目中要实现一个需求&#xff1a;“同时让两种类型的用户进行登录&#xff0c;登录后如果用户勾选了记住密码就要生成cookie来记录用户的密码和用户名”。本人做安全认证的时候一直在使用shiro&#xff0c;所以就想到在shiro的基础上进行一些扩展来满足需求。 shiro自…

ueditor跨域上传图片文件(基于jsp框架、tomcat)

额&#xff0c;好久没有用到ueditor了&#xff0c;因为现在的相关工作很少涉及到富文本编辑&#xff1b;最近临时带了一个项目&#xff0c;里面要用到富文本编辑器&#xff0c;而且文件要统一上传到文件服务器上保存&#xff1b;应为以前用过ueditor就试着在网上着一些跨域保存…

JavaWeb-RESTful_用SpringMVC开发RESTful

RESTful简介 一种软件架构风格、设计风格&#xff0c;而不是标准&#xff0c;只是提供了一组设计原则和约束条件。 它主要用于客户端和服务器交互类的软件。 基于这个风格设计的软件可以更简洁&#xff0c;更有层次&#xff0c;更易于实现缓存等机制。 RESTful可以理解为一种编…