范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

浅谈Web实时推送技术,有对比,有总结

  前言
  随着 Web 的发展,用户对于 Web 的实时推送要求也越来越高 ,比如,工业运行监控、Web 在线通讯、即时报价系统、在线游戏等,都需要将后台发生的变化主动地、实时地传送到浏览器端,而不需要用户手动地刷新页面。本文对过去和现在流行的 Web 实时推送技术进行了比较与总结。一、双向通信
  HTTP 协议有一个缺陷:通信只能由客户端发起。举例来说,我们想了解今天的天气,只能是客户端向服务器发出请求,服务器返回查询结果。HTTP 协议做不到服务器主动向客户端推送信息。这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。在WebSocket协议之前,有三种实现双向通信的方式:轮询(polling)、长轮询(long-polling)和iframe流(streaming)。
  1.轮询(polling)
  轮询是客户端和服务器之间会一直进行连接,每隔一段时间就询问一次。其缺点也很明显:连接数会很多,一个接受,一个发送。而且每次发送请求都会有Http的Header,会很耗流量,也会消耗CPU的利用率。优点:实现简单,无需做过多的更改缺点:轮询的间隔过长,会导致用户不能及时接收到更新的数据;轮询的间隔过短,会导致查询请求过多,增加服务器端的负担
  // 1.html
  <p id="clock"></p>
  <script>
  let clockDiv = document.getElementById("clock");
  setInterval(function(){
  let xhr = new XMLHttpRequest;
  xhr.open("GET","/clock",true);
  xhr.onreadystatechange = function(){
  if(xhr.readyState == 4 && xhr.status == 200){
  console.log(xhr.responseText);
  clockDiv.innerHTML = xhr.responseText;
  }
  }
  xhr.send();
  },1000);
  </script>
  //轮询 服务端
  let express = require("express");
  let app = express();
  app.use(express.static(__dirname));
  app.get("/clock",function(req,res){
  res.end(new Date().toLocaleString());
  });
  app.listen(8080);
  启动本地服务,打开http://localhost:8080/1.html,得到如下结果:
  2.长轮询(long-polling)
  长轮询是对轮询的改进版,客户端发送HTTP给服务器之后,看有没有新消息,如果没有新消息,就一直等待。当有新消息的时候,才会返回给客户端。在某种程度上减小了网络带宽和CPU利用率等问题。由于http数据包的头部数据量往往很大(通常有400多个字节),但是真正被服务器需要的数据却很少(有时只有10个字节左右),这样的数据包在网络上周期性的传输,难免对网络带宽是一种浪费。优点:比 Polling 做了优化,有较好的时效性缺点:保持连接会消耗资源; 服务器没有返回有效数据,程序超时。
  // 2.html 服务端代码同上
  <p id="clock"></p>
  <script>
  let clockDiv = document.getElementById("clock")
  function send() {
  let xhr = new XMLHttpRequest()
  xhr.open("GET", "/clock", true)
  xhr.timeout = 2000 // 超时时间,单位是毫秒
  xhr.onreadystatechange = function() {
  if (xhr.readyState == 4) {
  if (xhr.status == 200) {
  //如果返回成功了,则显示结果
  clockDiv.innerHTML = xhr.responseText
  }
  send() //不管成功还是失败都会发下一次请求
  }
  }
  xhr.ontimeout = function() {
  send()
  }
  xhr.send()
  }
  send()
  </script>
  3.iframe流(streaming)
  iframe流方式是在页面中插入一个隐藏的iframe,利用其src属性在服务器和客户端之间创建一条长连接,服务器向iframe传输数据(通常是HTML,内有负责插入信息的javascript),来实时更新页面。优点:消息能够实时到达;浏览器兼容好缺点:服务器维护一个长连接会增加开销;IE、chrome、Firefox会显示加载没有完成,图标会不停旋转。
  // 3.html
  <body>
  <p id="clock"></p>
  <iframe src="/a2020/img/data-img.jpg" data-src="/clock" style="display:none"></iframe>
  </body>
  //iframe流
  let express = require("express")
  let app = express()
  app.use(express.static(__dirname))
  app.get("/clock", function(req, res) {
  setInterval(function() {
  let date = new Date().toLocaleString()
  res.write(`
  <script type="text/javascript">
  parent.document.getElementById("clock").innerHTML = "${date}";//改变父窗口dom元素
  </script>
  `)
  }, 1000)
  })
  app.listen(8080)
  启动本地服务,打开http://localhost:8080/3.html,得到如下结果:
  上述代码中,客户端只请求一次,然而服务端却是源源不断向客户端发送数据,这样服务器维护一个长连接会增加开销。
  以上我们介绍了三种实时推送技术,然而各自的缺点很明显,使用起来并不理想,接下来我们着重介绍另一种技术--websocket,它是比较理想的双向通信技术。二、WebSocket
  1.什么是websocket
  WebSocket是一种全新的协议,随着HTML5草案的不断完善,越来越多的现代浏览器开始全面支持WebSocket技术了,它将TCP的Socket(套接字)应用在了webpage上,从而使通信双方建立起一个保持在活动状态连接通道。
  一旦Web服务器与客户端之间建立起WebSocket协议的通信连接,之后所有的通信都依靠这个专用协议进行。通信过程中可互相发送JSON、XML、HTML或图片等任意格式的数据。由于是建立在HTTP基础上的协议,因此连接的发起方仍是客户端,而一旦确立WebSocket通信连接,不论服务器还是客户端,任意一方都可直接向对方发送报文。
  初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?
  2.HTTP的局限性HTTP是半双工协议,也就是说,在同一时刻数据只能单向流动,客户端向服务器发送请求(单向的),然后服务器响应请求(单向的)。服务器不能主动推送数据给浏览器。这就会导致一些高级功能难以实现,诸如聊天室场景就没法实现。
  3.WebSocket的特点支持双向通信,实时性更强可以发送文本,也可以发送二进制数据减少通信量:只要建立起WebSocket连接,就希望一直保持连接状态。和HTTP相比,不但每次连接时的总开销减少,而且由于WebSocket的首部信息很小,通信量也相应减少了
  相对于传统的HTTP每次请求-应答都需要客户端与服务端建立连接的模式,WebSocket是类似Socket的TCP长连接的通讯模式,一旦WebSocket连接建立后,后续数据都以帧序列的形式传输。在客户端断开WebSocket连接或Server端断掉连接前,不需要客户端和服务端重新发起连接请求。在海量并发和客户端与服务器交互负载流量大的情况下,极大的节省了网络带宽资源的消耗,有明显的性能优势,且客户端发送和接受消息是在同一个持久连接上发起,实时性优势明显。
  接下来我看下websocket如何实现客户端与服务端双向通信:
  // websocket.html
  <p id="clock"></p>
  <script>
  let clockDiv = document.getElementById("clock")
  let socket = new WebSocket("ws://localhost:9999")
  //当连接成功之后就会执行回调函数
  socket.onopen = function() {
  console.log("客户端连接成功")
  //再向服务 器发送一个消息
  socket.send("hello") //客户端发的消息内容 为hello
  }
  //绑定事件是用加属性的方式
  socket.onmessage = function(event) {
  clockDiv.innerHTML = event.data
  console.log("收到服务器端的响应", event.data)
  }
  </script>
  // websocket.js
  let express = require("express")
  let app = express()
  app.use(express.static(__dirname))
  //http服务器
  app.listen(3000)
  let WebSocketServer = require("ws").Server
  //用ws模块启动一个websocket服务器,监听了9999端口
  let wsServer = new WebSocketServer({ port: 9999 })
  //监听客户端的连接请求 当客户端连接服务器的时候,就会触发connection事件
  //socket代表一个客户端,不是所有客户端共享的,而是每个客户端都有一个socket
  wsServer.on("connection", function(socket) {
  //每一个socket都有一个唯一的ID属性
  console.log(socket)
  console.log("客户端连接成功")
  //监听对方发过来的消息
  socket.on("message", function(message) {
  console.log("接收到客户端的消息", message)
  socket.send("服务器回应:" + message)
  })
  })
  启动本地服务,打开http://localhost:3000/websocket.html,得到如下结果:
  三、Web 实时推送技术的比较
  综上所述:Websocket协议不仅解决了HTTP协议中服务端的被动性,即通信只能由客户端发起,也解决了数据同步有延迟的问题,同时还带来了明显的性能优势,所以websocket 是Web 实时推送技术的比较理想的方案,但如果要兼容低版本浏览器,可以考虑用轮询来实现。

小米被一个大学生告了,要求赔偿一块钱流量费,法院判决结果已出大家有没有经历过触碰广告,随即自动下载APP呢?当前就有一个大学生,以广告侵犯权益将小米告上法庭。开始之前给大家先说一个和广告相关的手机圈热门事件,昨日消息,魅族科技官方删除魅族1Counterpoint华为和vivo并列中国高端手机市场600美元799美元价位段第二名中证网讯(记者张兴旺)日前,市场调研机构Counterpoint发布数据显示,今年7月份,vivo继续领跑国内智能手机市场,占据24的市场份额。紧随其后的是OPPO和小米荣耀排名国放弃三零手机重启魅蓝品牌魅族一夜回到三年前?如果不是今天魅蓝手机的官宣,可能都没多少人注意到,这个品牌已经离开我们1269天了。那这个品牌带给我们的最后一款新品是什么?大概是2018年夏天的魅蓝6T,已经快记不清了。为什么魅为什么动物没有进化成氮气呼吸?动物呼吸氧气本质上跟燃烧是类似的,就是用氧气跟某些物质的化学反应释放能量来让动物可以有能量活动。如下图所示就是动物呼吸作用的过程。而我们知道,氮气实际上是一种非常稳定的气体,用专业女股神连续两日出售特斯拉股票,套现1。38亿美元,对中国电动汽车市场的潜力持乐观态度新浪美股方舟投资公司创始人凯茜伍德旗下的三只基金在周三和周四连续两天出售特斯拉(754。86,0。99,0。13)股票,利用该股从数月的低迷表现中复苏之际,总计套现了约1。385亿基础软件开源为什么是数字基础设施定魂筑基的关键?2011年,网景公司创始人MarcAndreessen曾直言软件正在吞噬世界,现在看来,这句话很好地描绘了当下的现状。教育医疗交通金融每一个领域都切实感受到了软件的力量,因为科技的无缘2亿GalaxyS22Ultra仍使用前代相同的1。08亿主摄援引韩媒TheElec报道,三星不会在GalaxyS22Ultra主摄上使用2亿像素的ISOCELLHP1相机传感器,而是会依然使用和GalaxyS21Ultra相同的1。08亿像人类对地球的挖掘只有12000多米,地球内部会不会存在智慧生命体?当年美苏冷战,彼此从太空竞争到地面,海面,甚至地下。其中还有比着谁挖得更深,美国人选择在大洋上一处地壳较薄的位置开挖,大约到了4500米就放弃了,而苏联人在自己的广袤领土上也找了个金刚石能否代替芯片的基体材料硅?金刚石要能代替芯片的基本材料硅的话,母猪都能上树。在半导体发展历史上,最初流行锗半导体,不久就被硅半导体打败,最终硅统治了半导体王国,锗半导体仅在少数领域刷存在感。实话实说,金刚石vivoX70Pro详细参数汇总,对比X60Pro怎么样?性能方面Exynos1080处理器LPDDR5增强版ufs3。1(上代是LPDDR4X)影像方面5000像素IMX766V大底微云台主摄1200万像素IMX663人像1200万像素日本氢能源专利数量第一,中国电能源汽车销量第一,谁是未来趋势如今新能源汽车的需求量只高不下,在这种情况下,日本将发展重点放在了氢能源方面,而中国则是在大力发展电能源汽车,其销量拿下了世界第一,究竟谁才是未来的发展趋势呢?日本氢能源专利数量全