实时响应数据

在Web应用开发中,我们会经常需要实时响应数据,例如:网页聊天室、实时更新网页在线人数等很多的应用场景。我们前后端数据的交互,通常使用ajax进行交互,所以下面的两种方法都是基于ajax交互技术。

短轮询

下面我先给大家一个应用场景:网页聊天室,对方发信息过来,我们的前端界面必须马上响应出来,我们发信息过去,对方也要马上响应到前端界面。

解决问题的思路:
1.前端要不停地向后端发送请求(ajax请求)
2.两个人的聊天记录可以放置于缓存中(redis)
3.每次ajax访问请求,把缓存中的聊天数据重新响应到前端

短轮询,不停的询问请求,而且每次请求时间特别短,这就意味着前端要每隔很短的时间就发送一次ajax请求,不停的响应缓存中的数据到前端界面。这势必会增加服务器的压力,但是我还是将这样一种思想用代码展示下。

 //刷新聊天function flush() {$.ajax({url: "text",type: "POST",data: {name:name},async: false,success: function (data) {$(data).each(function () {//成功回调函数,遍历data数据,进行前端渲染,这里自由发挥})},error: function (XMLHttpRequest) {alert(XMLHttpRequest.status);}});setTimeout("flush()",1000); //一秒中后再次调用flush()方法 ,就这样不停的短轮询}

后端的请求大家就自由发挥了,你想要返回什么数据就返回什么数据,前端想怎么渲染就怎么渲染。
大家可以看到,短轮询以如此速度发送请求将给服务器造成巨大的压力,所以我推荐大家使用长轮询,下面就给大家介绍。

长轮询

长轮询概念:前端向服务器发送请求,一直保持着请求,直到服务器响应才结束这次请求,相比于短轮询的发送请求次数,可以说长轮询是巨大的优化。

类似于:好友发送消息给我,才局部响应到我的聊天界面,不用一直去请求刷新。

//这是前端的ajax请求function longConnection() {$.ajax({url : "long",type : "POST",success : function(data) {if(data=="flush"){alert("刷新");//后端请求判断返回字符串}longConnection(); //结束这次请求后,再次调用本身方法},error : function(XMLHttpRequest) {alert(XMLHttpRequest.status);longConnection();//发生异常错误后再次发起请求}});}
//光看前端的ajax请求看不出什么,看看后面的后端请求

@Controller
public class LongConnectionController {
@Autowired
private RedisTemplate redisTemplate;
private static final long TIMEOUT = 20000;// 超时时间设置为20秒,这个时间随便你设置
//我设置20s,代表我这次请求最多维持20s

@RequestMapping("/long")
@ResponseBody
public  String longConnection(HttpSession session)throws Exception{String msg="";long requestTime = System.currentTimeMillis(); //获取进入请求时间while(System.currentTimeMillis()-requestTime<TIMEOUT){//我这是从redis读取一个标志,如果不为null,代表我接受到新消息,我就得刷新String o =(String) redisTemplate.opsForHash().get("one", flag);if(o!=null){//读取后就清空标志,下次有人发消息再设置redisTemplate.opsForHash().delete("one",flag);msg="flush";  //msg复制“flush”,前端判断渲染界面break;  //退出循环,马上响应}else {msg="timeOut";Thread.sleep(1000);  //休眠1s}}return msg;
}
}

我解释下上面的代码:
前端发送ajax请求过来,后端并不会马上响应,自然维持了这次请求的时间。后端请求设置了20s的超时时间,用一个while循环加时间戳循环20s,当判断有新消息时,马上break出while循环,返回数据给前端。

所以只要判断没有新消息,while循环就会维持20s,即这个请求会维持20s,当然我们可以设置更长的时间,这都不影响。

聊天室效果展示



挺好玩的,关于实时接收信息还有很多方法,以上就是介绍两种,欢迎大家评论!

实时响应数据之短轮询和长轮询相关推荐

  1. 长连接、短连接、短轮询、长轮询

    长连接.短连接.短轮询.长轮询 短连接:每次Http请求都会建立Tcp连接,管理容易 长连接:只需要建立一次Tcp连接,以后Http请求重复使用同一个Tcp连接,管理难 短轮询:重复发送Http请求, ...

  2. ajax长轮询 java web_网页实时聊天之js和jQuery实现ajax长轮询

    众所周知,HTTP协议是无状态的,所以一次的请求都是一个单独的事件,和前后都没有联系.所以我们在解决网页实时聊天时就遇到一个问题,如何保证与服务器的长时间联系,从而源源不段地获取信息. 一直以来的方式 ...

  3. java+jquery实现长轮询案例_网页实时聊天之js和jQuery实现ajax长轮询

    众所周知,HTTP协议是无状态的,所以一次的请求都是一个单独的事件,和前后都没有联系.所以我们在解决网页实时聊天时就遇到一个问题,如何保证与服务器的长时间联系,从而源源不段地获取信息. 一直以来的方式 ...

  4. ajax长轮询vue,轮询、长轮询、websock

    引入 Web端即时通讯技术:即时通讯技术简单的说就是实现这样一种功能:服务器端可以即时地将数据的更新或变化反应到客户端,例如消息即时推送等功能都是通过这种技术实现的.但是在Web中,由于浏览器的限制, ...

  5. 轮询、长轮询与Web Socket的前端实现

    Web Socket 应用场景:实现即时通讯:如股票交易行情分析.聊天室.在线游戏等,替代轮询和长轮询 轮询 轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由 ...

  6. mysql长轮询_ajax的轮询和长轮询

    概念: 轮询(polling):客户端按规定时间定时像服务端发送ajax请求,服务器接到请求后马上返回响应信息并关闭连接. 概念总是枯燥的,只有代码方能解心头之快 前段代码:index.html: v ...

  7. 长轮询java_网络编程-轮询和长轮询

    轮询(Polling):是指不管服务器端有没有更新,客户端(通常是指浏览器)都定时的发送请求进行查询,轮询的结果可能是服务器端有新的更新过来,也可能什么也没有,只是返回个空的信息.不管结果如何,客户端 ...

  8. ajax长轮询 java web_浅谈Websocket、Ajax轮询和长轮询(long polling)

    浅谈Websocket.Ajax轮询和长轮询(long p0ll) 最近看到了一些介绍Websocket的文章,觉得挺有用,所以在这里将自己的对其三者的理解记录一下. 1.什么是Websocket W ...

  9. php http长轮询,http长轮询短轮询

    http 协议介绍: http 协议是请求/响应范式的, 每一个 http 响应都是由一个对应的 http 请求产生的; http 协议是无状态的, 多个 http 请求之间是没有关系的. http ...

最新文章

  1. linux下各种颜色的文件表示的文件类型
  2. [AsyncHandle]什么引发了ObjectDisposedException?
  3. 批量修改nginx配置文件
  4. 算法提高课-图论-单源最短路的扩展应用-AcWing 1137. 选择最佳线路:多源最短路、虚拟源点
  5. silverlight,WPF动画终极攻略之番外 3D切换导航篇(Blend 4开发)
  6. 【Angular】双向数据绑定--作用域树
  7. matlab将struct和cell转换成matrices
  8. 【HDU - 6447】YJJ's Salesman(降维dp,树状数组优化dp)
  9. PHP7 下安装 memcache 和 memcached 扩展
  10. 2020年4月数据库流行度排行:MySQL 成事实王者,国产openGauss引期待
  11. 将VS Code用于C#脚本
  12. pandas 股票分析图
  13. java安全框架下载文件_java安全框架之Permission学习笔记
  14. 微信小程序生成海报及源代码
  15. Ext JS 6学习文档–第1章–ExtJS入门指南
  16. linux服务器密码策略设置:登录密码错误次数限制
  17. 一周信创舆情观察(1.10~1.16)
  18. 解决 Error starting userland proxy: listen tcp 0.0.0.0:6379: bind: address already in use
  19. Codeforces Young Physicist
  20. 2021.12.26 第一章. 计算机组成与体系结构

热门文章

  1. 2022-2028年全球及中国啤酒杯行业投资前景分析
  2. STM32CUBEMX and 战舰STM32开发平台V2 (一)
  3. 责任链模式在王者荣耀中的应用
  4. Java中的同步和异步
  5. Object类九大方法之finalize方法
  6. 和平精英小程序服务器开小差,和平精英前五机制提示关闭方法
  7. 报错1099端口被占用的解决办法
  8. HashMap扩容操作resize
  9. Hector-SLAM初使用
  10. 程序员撩妹神操作,看完我是绝望的!