返回顶部
首页 > 资讯 > 服务器 >前端实时通信的8种方式及其优缺点和实现方式
  • 852
分享到

前端实时通信的8种方式及其优缺点和实现方式

2024-04-02 19:04:59 852人浏览 泡泡鱼
摘要

1.短轮询 短轮询的原理很简单,每隔一段时间客户端就发出一个请求,去获取服务器最新的数据,一定程度上模拟实现了即时通讯。 优点:兼容性强,实现非常简单缺点:延迟性高,请求中有大半是无

1.短轮询

短轮询的原理很简单,每隔一段时间客户端就发出一个请求,去获取服务器最新的数据,一定程度上模拟实现了即时通讯。

  • 优点:兼容性强,实现非常简单
  • 缺点:延迟性高,请求中有大半是无用,非常消耗带宽和服务器资源,影响性能
  • 应用: 二维码扫码确认、信息通知
  • 实现方式:
    借用定时器实现短轮询
created(){
	this.shortPolling = setInterval(function(){
	    that.getRuset()
	},5000)
},
...
getResult(){
	var that = this
	this.$axiOS('xxx,',post).then(res=>{
		if(res.code === 200){//拿到想要的结果
			 ...
			 //定时器是否清除由业务场景决定
			 clearInterval(this.shortPolling)
		}
	})
}

2.comet(长轮询、长连接)

comet有两种主要实现手段,一种是基于 ajax 的长轮询(long-polling)方式,另一种是基于 Iframe 及 htmlfile 的流(streaming)方式,通常被叫做长连接。
具体两种手段的操作方法请移步Comet技术详解:基于Http长连接的WEB端实时通信技术

2.1、长轮询

客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。

  • 优点:兼容性好,在无消息的情况下不会频繁的请求,资源浪费较小
  • 缺点:服务器hold连接会消耗资源,返回数据顺序无保证,难于管理维护
  • 应用: webQQ、开心网、校内,Hi网页版、Facebook IM等等
  • 实现方式:
    主要由后端hold住连接,我们就是正常的发送请求即可
getResult(){
	var that = this
	this.$axios('xxx,',post).then(res=>{
		if(res.code === 200){
			...
		}else{
			this.getResult()
		}
		...
	})
}

正常来说我们前端会设置请求超时时间,那么我们就和后端约定,在超时范围内必须返回结果在前端即可。

2.2、长连接

在页面里嵌入一个隐蔵iframe,将这个隐蔵iframe的src属性设为对一个长连接的请求或是采用xhr请求,服务器端就能源源不断地往客户端输入数据。 此方法已经过时,我推荐使用,毕竟现在都已经放弃iframe

  • 优点:兼容性好,消息即时到达,不发无用请求
  • 缺点:服务器维护长连接消耗资源
  • 实例:Gmail聊天
  • 实现方式:
//在Vue中嵌入iframe
<iframe ref="iframe" v-show="iframeShow"></iframe>

watchIframe(){
	//先找到iframe的窗口
	this.iframeWin = this.$refs.iframe.contentWindow;
	//向iframe发送信息,大括号内是发送的内容;
	this.iframeWin.postMessage(
	     { 
	
	      },"*"
	);
	//怎样监听iframe传过来的信息
	window.addEventListener("message", this.handleMessage);
	//获取iframe传过来的信息
	handleMessage(res){
	  //res为传过来的信息
	 ...//渲染页面
	}
}

3.SSE 使用指南请看Server-Sent Events 教程

SSE(Server-Sent Event,服务端推送事件)是一种允许服务端向客户端推送新数据的HTML5技术

  • 优点:基于HTTP而生,因此不需要太多改造就能使用,使用方便,而websocket非常复杂,必须借助成熟的库或框架
  • 缺点:基于文本传输效率没有webSocket高,不是严格的双向通信,客户端向服务端发送请求无法复用之前的连接,需要重新发出独立的请求,并且不兼容IE
source.addEventListener('open', function (event) {
  // ...
}, false);
//客户端收到服务器发来的数据,就会触发message事件,可以在onmessage属性的回调函数。
source.addEventListener('message', function (event) {
  var data = event.data;
  // handle message
}, false);

//如果发生通信错误(比如连接中断),就会触发error事件,可以在onerror属性定义回调函数。
source.addEventListener('error', function (event) {
  // handle error event
}, false);

//close方法用于关闭 SSE 连接。
source.close();

我们也可以自定义事件,Server-Sent Events 教程里都有明确的使用方法

4.Websocket

Websocket是一个全新的、独立的协议,基于tcp协议,与http协议兼容、却不会融入http协议,仅仅作为html5的一部分,其作用就是在服务器和客户端之间建立实时的双向通信。

  • 优点:真正意义上的实时双向通信,性能好,低延迟
  • 缺点:独立与http的协议,因此需要额外的项目改造,使用复杂度高,必须引入成熟的库,无法兼容低版本浏览器
  • 实现方式:

浏览器为 HTTP 通信提供了 XMLHttpRequest 对象,同样的,也为 WebSocket 通信提供了一个通信操作接口:WebSocket。

 var ws = new WebSocket("wss://echo.websocket.org");

  // 当连接建立成功,触发 open 事件
  ws.onopen = function(evt) {
    console.log("建立连接成功 ...");

    // 连接建立成功以后,就可以使用这个连接对象通信了
    // send 方法发送数据
    ws.send("Hello WebSockets!");
  };

  // 当接收到对方发送的消息的时候,触发 message 事件
  // 我们可以通过回调函数的 evt.data 获取对方发送的数据内容
  ws.onmessage = function(evt) {
    console.log("接收到消息: " + evt.data);

    // 当不需要通信的时候,可以手动的关闭连接
    // ws.close();
  };

  // 当连接断开的时候触发 close 事件
  ws.onclose = function(evt) {
    console.log("连接已关闭.");
  }

5.Web Worker

Web Worker 的作用,就是为 javascript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行

  • 优点:实现多线程环境,摆脱了js的单线程
  • 缺点:无法访问DOM节点;无法访问全局变量或是全局函数;无法调用alert()或者confirm之类的函数;无法访问window、document之类的浏览器全局变量;
    注意:Web Worker中的Javascript依然可以使用setTimeout(),setInterval()之类的函数,也可以使用XMLHttpRequest对象来做Ajax通信
  • 实例:大数据的处理;高频的用户交互:
  • 实现方式:

Web workers可分为两种类型:专用线程、共享线程。
专用线程随当前页面的关闭而结束;这意味着专用线程只能被创建它的页面访问。
与之相对应的共享线程可以被多个页面访问。

5.1、专用线程

使用 onmessage() , postmessage()通信


//注册专用线程
let worker = new Worker ('worker.js')
worker.onmessage = (e) => {
  console.log(e.data) // I post a message to main thread
}
worker.postMessage('main thread Got a message')
 

onmessage = (e) => {
    console.log(e.data) // main thread got a message
}
postMessage('I post a message to main thread')

// 在主线程中终止
worker.terminate()
 
// 在子线程中终止自身
self.close()

5.2、共享线程

SharedWorker需要用到port属性,接收需要先connect

//注册共享线程
let worker = new SharedWorker("sharedworker.js");

worker.port.onmessage = function(e){}
worker.port.postMessage('data');
 

addEventListener('connect', function(event){
    var port = event.ports[0]
    //接收
    port.onmessage = function(event){
        console.log(event.data);
    };
    //发送
    port.postMessage("data");
    port.start();
});

// 在主线程中终止
worker.terminate()
 
// 在子线程中终止自身
self.close()

两种方式的错误监听同SSE一样

worker.addEventListener("error", function(evt){  
	alert("Line #" + evt.lineno + " - " + evt.message + " in " + evt.filename);  
	}, false);  
	worker.postMessage(10000);  
});  

6.Service workers

Service workers 本质上充当Web应用程序与浏览器之间的代理服务器,也可以在网络可用时作为浏览器和网络间的代理,创建有效的离线体验。 它是 Web Worker 的一个类型

  • 优点:可以秒开或者离线访问
  • 缺点:IE11 、Opera Mini 、IOS不支持
  • 应用:推送通知 — 允许用户选择从网络应用程序及时更新。
  • 实现方式:
// serviceWorker.js
import { reGISter } from 'register-service-worker'

if (process.env.node_ENV === 'production') {
  register('service-worker.js', {
    ready () {
      console.log(
        'App is being served from cache by a service worker.'
      )
    },
    registered () {
      console.log('Service worker has been registered.')
    },
    cached () {
      console.log('Content has been cached for offline use.')
    },
    updatefound () {
      console.log('New content is downloading.')
    },
    updated () {
      console.log('New content is available; please refresh.')
      window.location.reload(true)   // 这里需要刷新页面
    },
    offline () {
      console.log('No internet connection found. App is running in offline mode.')
    },
    error (error) {
      console.error('Error during service worker registration:', error)
    }
  })
}

在 plugins 加入

plugins: [
    new SWPrecachewebpackPlugin({
      cacheId: 'my-project-name',
      filename: 'service-worker.js',
      staticFileGlobs: ['dist*.{js,html,CSS}'],
      minify: true,
      stripPrefix: 'dist/'
    }),

    new WebpackPwaManifest({
      name: 'My Progressive Web App',
      short_name: 'MyPWA',
      description: 'My awesome Progressive Web App!',
      background_color: '#ffffff',
      crossorigin: 'use-credentials', //can be null, use-credentials or anonymous
      icons: [
        {
          src: path.resolve('src/assets/icon.png'),
          sizes: [96, 128, 192, 256, 384, 512] // multiple sizes
        },
        {
          src: path.resolve('src/assets/large-icon.png'),
          size: '1024x1024' // you can also use the specifications pattern
        }
      ]
    }),
    // ...
]

这个时候打包出来的代码根目录里面多了个 service-worker.js ,html文件里面 pwa 相关元素也加上了。
在入口 main.js 引入该文件:

import './serviceWorker'

7、Flash Socket

在页面中内嵌入一个使用了Socket类的 Flash 程序JavaScript通过调用此Flash程序提供的Socket接口与服务器端的Socket接口进行通信,JavaScript在收到服务器端传送的信息后控制页面的显示。 一般用在网络游戏中,web端基本不适用,加上早在 2017 年 7 月,Flash 的娘家 Adobe 已宣布在 2020年 底终止对 Flash 的支持。各个浏览器也在2020年底左右终止对 Flash 的支持

  • 优点:实现真正的即时通信,而不是伪即时。
  • 缺点:客户端必须安装Flash插件;非HTTP协议,无法自动穿越防火墙。
  • 实例:网络互动游戏。
  • 实现方式:因为都已经抛弃了,加上我并非游戏类前端,我就没了解Flash实现方式,有兴趣的小伙伴可以自行去研究一下

8、总结

  • 我在实际项目中,只使用过短轮询和长轮询,其他的实时通讯方法并没有真正使用过(业务场景并没有其他需求)而且后端也给不了太多支持来实现是否可行。
  • 长轮询与服务器的通信会比短轮询更实时,短轮询是在采用定时器,定时器就有时间差,比如我们定时5秒钟。可能一秒钟内我们就实现了数据通信,那么会有4秒的等待时间。而长轮询就可以这个顾虑。
  • 是否可以使用回调递归实现实时通信,可以,他类比短轮询,但是回调递归并发量太大了,很容易造成服务器死机,并且消耗宽带影响到前端性能,所以我们正常不会使用回调递归实现,而且回调递归也不叫作短轮询。
  • 为了方便以后使用,并单纯的学习
  • 此次总结是看了N篇文章的结合,有不足之处,敬请指出。

更多关于前端实时通信方式及其优缺点和实现方式请查看下面的相关链接

--结束END--

本文标题: 前端实时通信的8种方式及其优缺点和实现方式

本文链接: https://lsjlt.com/news/147846.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 前端实时通信的8种方式及其优缺点和实现方式
    1.短轮询 短轮询的原理很简单,每隔一段时间客户端就发出一个请求,去获取服务器最新的数据,一定程度上模拟实现了即时通讯。 优点:兼容性强,实现非常简单缺点:延迟性高,请求中有大半是无...
    99+
    2024-04-02
  • web前端实时通信的方式是什么
    这篇“web前端实时通信的方式是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“web前端实时通信的方式是什么”文章吧。1...
    99+
    2023-06-30
  • 原生Javascript实现继承方式及其优缺点详解
    目录前言原型继承优点缺点 构造函数继承 优点 缺点 组合式继承 寄生式组合继承总结前言 最近在复习javascript的一些基础知识,为开启新的征程做准备。所以开始记录一些自己学习的...
    99+
    2024-04-02
  • Python 实现栈的几种方式及其优劣
    ​​想了解更多关于开源的内容,请访问:​​​​51CTO 开源基础软件社区​​​​https://ost.51cto.com​​一、栈的概念栈由一系列对象对象组织的一个集合,这些对象的增加和删除操作都遵循一个“后进先出”(Last In F...
    99+
    2023-05-19
    Python 数据结构
  • PHP中常用的路由方式及其优缺点
    在Web开发中,路由(Routing)是指根据URL地址来确定如何处理请求的过程。PHP作为一种流行的后台语言,拥有多种路由方式可以选择。在本文中,我们将介绍几种常用的PHP路由方式,并探讨它们的优缺点。基于查询字符串(Query Stri...
    99+
    2023-10-21
    路由 优缺点 关键词:PHP
  • web前端开发中父链和子链方式实现通信
    父链和子链是一种父子间组件通信的新方式。概念父链:在子组件中,使用this.$parent可以直接访问该组件的父实例或组件,【类似于原生或者jquery中获取父节点的方式,但是并没有操作dom】子链:在父组件中,使用this.$childr...
    99+
    2023-06-04
  • Java实现异步的8种方式
    一、前言         异步执行对于开发者来说并不陌生,在实际的开发过程中,很多场景多会使用到异步,相比同步执行,异步可以大大缩短请求链路耗时时间,比如:「发送短信、邮件、异步更新等」,这些都是典型的可以通过异步实现的场景。     二、...
    99+
    2023-09-20
    java
  • Redis常见的几种使用方式及优缺点
    这篇文章主要介绍“Redis常见的几种使用方式及优缺点”,在日常操作中,相信很多人在Redis常见的几种使用方式及优缺点问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redi...
    99+
    2024-04-02
  • C++设计模式之工厂方法模式的实现及优缺点
    工厂方法模式是在简单工厂模式的缺点上进行优化的,我们都知道,在简单工厂模式中,要去增加或者减少一个产品的类型,都需要修改工厂中的if-else判断。这样子显然不符合我们代码开发中的开...
    99+
    2024-04-02
  • 八种vue实现组建通信的方式
    目录一、组件通信1、props 父组件--->子组件通信2、$emit 子组件--->父组件传递3、bus(事件总线) 兄弟组件通信4、$parent、$children...
    99+
    2024-04-02
  • python实现定时任务的8种方式详解
            在日常工作中,常常会用到需要周期性执行的任务,一种方式是采用 Linux 系统自带的 crond 结合命令行实现。另外一种方式是直接使用Python。                 当每隔一段时间就要执行一段程序,或者往复...
    99+
    2023-09-09
    python 定时任务
  • 浅谈前端JS沙箱实现的几种方式
    目录前言 iframe实现沙箱 diff方式实现沙箱 基于代理(Proxy)实现单实例沙箱 基于代理(Proxy)实现多实例沙箱 结束语 参考前言 在微前端领域当中,沙箱是很重要的...
    99+
    2024-04-02
  • JS中的六种继承方式以及优缺点总结
    目录前言原型链继承 构造函数继承 组合继承(原型链继承和构造函数继承组合) 寄生式继承 组合寄生式继承 extends继承 总结前言 继承是JS世界中必不可少的一个环节,号称JS的三...
    99+
    2024-04-02
  • 【异步】Java 的 8 种异步实现方式
    异步执行对于开发者来说并不陌生,在实际的开发过程中,很多场景多会使用到异步,相比同步执行,异步可以大大缩短请求链路耗时时间,比如:发送短信、邮件。 异步的八种实现方式: 线程异步 Thread/Run...
    99+
    2023-09-08
    java spring 开发语言
  • 详解Spring依赖注入的三种方式以及优缺点
    目录0.概述1.属性注入1.1 优点分析1.2 缺点分析2.Setter 注入优缺点分析3.构造方法注入优点分析总结0.概述 在 Spring 中实现依赖注入的常见方式有以下 3 种...
    99+
    2024-04-02
  • Android网络通信的实现方式
    Android网络编程分为两种:基于http协议的,和基于socket的。 基于Http协议:HttpClient、HttpURLConnection、AsyncHttpCli...
    99+
    2022-06-06
    通信 Android
  • react的通信方式怎么实现
    今天小编给大家分享一下react的通信方式怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一...
    99+
    2024-04-02
  • Java、Unix和JavaScript的分布式计算优势及其实现方法。
    Java、Unix和JavaScript的分布式计算优势及其实现方法 随着互联网技术的发展,分布式计算已经成为了现代计算机技术的重要研究领域之一。Java、Unix和JavaScript作为目前广泛使用的编程语言,在分布式计算方面有着自己的...
    99+
    2023-09-10
    unix 分布式 javascript
  • PHP和WebSocket: 实现即时通信的优化方法
    PHP和WebSocket: 实现即时通信的优化方法引言:随着互联网的快速发展,即时通信成为人们生活中必不可少的一部分。而在建立一个高效和可靠的即时通信系统中,WebSocket技术的应用变得越来越普遍,它可以实现双向实时通信,大大提高了用...
    99+
    2023-12-17
    优化 PHP websocket
  • 详解Android 进程间通信的几种实现方式
    一、概述 由于应用程序之间不能共享内存。在不同应用程序之间交互数据(跨进程通讯),在Android SDK中提供了4种用于跨进程通讯的方式。 这4种方式正好对应于android...
    99+
    2022-06-06
    进程 进程间通信 通信 Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作