【WebSocket】前端使用WebSocket实时通信

这篇具有很好参考价值的文章主要介绍了【WebSocket】前端使用WebSocket实时通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

最近写项目,需要实现消息通知和实时聊天的功能,就去了解了一些关于websocket的知识,总结如下。

什么是WebSocket

WebSocket 是一种在 Web 应用中实现实时通信的协议。与传统的 HTTP 请求不同,WebSocket 连接在客户端和服务器之间建立一个持久性双向通信管道,使得数据可以在连接打开后随时传递。这消除了 HTTP 请求的开销,能更好的节省服务器资源和带宽,同时在实时应用中提供了更好的性能和响应性。

WebSocket 就像是你和服务器之间的一个电话线,可以在任何时候进行通话。和普通的浏览网页不同,WebSocket 让你能够实时地接收和发送信息,而不需要频繁地向服务器询问是否有新的消息。

WebSocket的工作原理

WebSocket 协议的工作原理基于握手(handshake)和消息传递。当客户端发起 WebSocket 握手请求时,服务器将进行握手确认,建立连接。一旦连接建立,客户端和服务器可以互相发送消息,而不必每次都进行新的握手。

  1. 建立连接: 在客户端(浏览器)发起 WebSocket 连接请求时,服务器会进行响应,建立一个持久的连接通道。这个过程类似于握手,它使用了 HTTP/HTTPS 协议来发起连接请求。
  2. 双向通信: 连接建立成功,客户端和服务器都可以通过这个通道实时地发送和接收数据,消息可以是文本或二进制数据。不像传统的 HTTP 请求,WebSocket 允许服务器主动向客户端推送数据,也允许客户端向服务器发送请求,实现双向通信。
  3. 保持连接: 一旦连接建立,客户端和服务器之间就会保持一个持久的连接通道,不需要每次都重新建立连接。这使得数据传输更加高效,减少了不必要的连接建立和关闭开销。
  4. 关闭连接: 当客户端或服务器希望终止连接时,可以发送一个特殊的关闭帧,告知对方要关闭连接。对方接收到关闭帧后,也会发送一个确认帧,并关闭连接。这是一个优雅的断开连接方式,不需要像传统的 HTTP 请求那样等待服务器的响应。类似于双方结束通话,然后挂断电话。

WebSocket与HTTP的关系

WebSocket 和 HTTP 是两种不同的协议,它们有着不同的通信方式、连接状态和数据传输方式。WebSocket在实现实时性通信方面更加高效,而 HTTP 更适用于请求-响应式的短期数据交换。

  • 共同点: WebSocket 和 HTTP 都是用于网络通信的协议,都是在应用层工作。它们都基于 TCP/IP 协议,用于在客户端和服务器之间传输数据。
  • 联系: WebSocket 协议最初是作为 HTTP 协议的扩展而提出的,因此在握手阶段使用了 HTTP 协议来建立连接。WebSocket 握手请求使用的是 HTTP 请求,然后在协议升级时切换到 WebSocket 协议,建立持久的双向连接。所以,WebSocket是在 HTTP 协议的基础上构建的。
  • 区别:
    1. HTTP是请求-响应式通信,数据通常单向传输。而WebSocket 是全双工通信,双向数据传输。
    2. 在 HTTP 中,每次请求和响应都会携带大量的头部信息,这些信息描述了请求和响应的性质。而在 WebSocket 握手时,也会有一些头部信息,但之后数据传输时的头部相对较少,从而减少了传输开销,且websocket没有像http那样可以只定义请求头的一些参数,只有一个Sec-WebSocket-Protocol属性用于自定义子协议。
    3. HTTP 适用于传输短期请求-响应式的数据,如网页的加载和表单提交。WebSocket 更适用于实时性要求较高的场景,如在线聊天、实时数据更新、多人协作等。

HTTP建立持久化连接

HTTP Keep-Alive (长连接): 长连接是一种保持连接打开的通信方式,客户端与服务器建立连接后,在一段时间内保持连接处于打开状态,以便后续的 HTTP 请求复用它。在长连接中,一次 TCP 连接可以被用来发送多个 HTTP 请求和响应,而不是每次请求都建立一个新的连接。

Keep-Alive 适用于需要实时数据传输的场景,如聊天应用、实时游戏、实时数据监控等。它可以实现低延迟的实时通信,提高通信效率。但需要维护长时间的连接状态,对服务器资源和网络负载有一定影响。

Long Polling(长轮询) :长轮询是一种模拟实时通信的方法。在长轮询中,客户端发送一个请求到服务器,服务器在等待新数据或事件的时候,保持连接打开,直到有新的数据或事件发生时才发送响应给客户端。客户端收到响应后立即处理,然后再次发送请求,以保持连接。

长轮询适用于不支持真正长连接的环境,如基于HTTP协议的环境。它可以模拟实时通信,但因为每次响应后都需要重新建立连接,所以在一些情况下可能会有较高的延迟和网络开销。

WebSocket类封装

class WebSocketClass {
  constructor(wsurl, time) {
    this.wsurl = wsurl //连接地址
    this.token = localStorage.getItem("accessToken")
    this.time = time //多少秒执行检测
    this.socketTask = null
    this.is_open_socket = false //避免重复连接
    this.heartbeatInterval = null //检测服务器端是否还活着
    this.reconnectTimeOut = null //重连之后多久再次重连

    this.connectSocketInit()
  }
  // 建立初始连接
  connectSocketInit() {

    this.socketTask = new WebSocket(this.wsurl, this.token)
    // 当连接成功时
    this.socketTask.onopen = (res) => {
      console.log("websocket连接成功!", res);
      this.is_open_socket = true
      //连接正常清除重连定时器
      this.clearReconnect();
      // this.startHeartbeat();
    }
    // 当收到消息时
    this.socketTask.onmessage = (res) => {
      console.log(res.data)
    }
    // 当连接出错时
    this.socketTask.onerror = (res) => {
      console.log("websocket连接出错!", res);
      this.is_open_socket = false
      // this.reconnect()
    }
    // 当连接关闭时
    this.socketTask.onclose = (res) => {
      console.log("websocket已经被关闭了!", res);
      this.is_open_socket = false
      // this.reconnect()
    }
  }
  // 发送消息
  send(value) {
    if (this.is_open_socket) {
      this.socketTask.send(value);
    } else {
      console.log("无法发送消息:WebSocket未连接");
    }
  }
  // 开启心跳检测
  startHeartbeat() {
    this.heartbeatInterval = setInterval(() => {
      const heartbeatMessage = {
        value: "测试一下服务器端是否在连接状态",
        method: "开启心跳机制"
      };
      this.send(JSON.stringify(heartbeatMessage)) // 发送心跳消息
    }, this.time * 1000)
  }
  //停止发送心跳
  stopHeartbeat() {
    clearInterval(this.heartbeatInterval);
  }
  // 清除重连定时器
  clearReconnect() {
    clearTimeout(this.reconnectTimeout);
  }
  // 重新连接
  reconnect() {
    //停止发送心跳
    this.stopHeartbeat()
    //如果不是人为关闭的话,进行重连
    if (!this.is_open_socket) {
      this.reconnectTimeOut = setTimeout(() => {
        this.connectSocketInit();
      }, 3000)
    }
  }
  //外部获取消息
  getMessage(callback) {
    this.socketTask.onmessage = (res) => {
      return callback(res) // 调用外部回调函数处理消息
    }
  }
}
export default WebSocketClass;
// 调用方法
// -------------------------------------------------------------------
// 单页面
// import WebSocketClass from '@/network/webSocket';
// let ws = new WebSocketClass("ws:****",5000)
// 发送消息
// let data={value:"传输内容",method:"方法名称"}
// ws.send(JSON.stringify(data));
// 接收消息
// ws.getMessage(res=>{
// 	console.log(res);
// })

可能学习的不够深刻、总结不到位,请谅解。如有误,请指正!
【WebSocket】前端使用WebSocket实时通信,前端知识总结,websocket,网络协议,前端文章来源地址https://www.toymoban.com/news/detail-669554.html

到了这里,关于【WebSocket】前端使用WebSocket实时通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Spring WebSocket实现实时通信功能

    🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页 ——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍专栏》 🐾 学会IDEA常用操作,工作效率翻倍~💐 🌊 《100天精通Golang(基础

    2024年02月09日
    浏览(26)
  • 集成websocket实现实时通信(ruoyi 使用笔记)

    Websocket 是一种基于 TCP 协议的全双工通信协议,它使得客户端和服务器之间可以进行实时的双向通信。相对于传统的 HTTP 协议只能通过客户端发送请求,然后等待服务端的响应,WebSocket 可以让客户端和服务器在任何时候都可以相互发送消息,这种实时通信的方式非常适合需要

    2024年02月07日
    浏览(28)
  • 进度变动实时通知-使用SocketIO实现前后端的通信(基于WebSocket的实时通信库)

    最近在接触的一个项目,将PDF上传到项目里,通过调用OCR云服务把PDF里的表格数据识别出来。在此过程中,前后端需要实时通信,对识别数据进行“进度跟踪”。因此我们采用SocketIO的通讯方式,识别中前端和后端服务建立SocketIO连接,根据事件进行数据的实时更新百分比进度

    2024年02月06日
    浏览(37)
  • 使用React 18和WebSocket构建实时通信功能

    WebSocket 是一种在 Web 应用中实现双向通信的协议。它允许服务器主动向客户端推送数据,而不需要客户端发起请求。在现代的实时应用中, WebSocket 经常用于实时数据传输、聊天功能、实时通知和多人协作等场景。在本篇博客中,我们将探索如何在 React 18 应用中使用 WebSocke

    2024年02月05日
    浏览(30)
  • 浅测SpringBoot环境中使用WebSocket(多端实时通信)

    目录 概述 测试:前端代码 后端代码(SpringBoot环境)  1.创建处理器类(用于处理连接和消息) 2.创建配置类(用于注册处理器类,开启WebSocket) 连接测试  这篇博客主要是记录测试使用WebSocket的过程。 需求说明 :最近在做一个预约系统,有用户端和医生端,用户端展示着

    2024年02月09日
    浏览(22)
  • 如何在Node.js中使用WebSocket实现实时通信

    在Web应用程序中,实时通信已经成为一种必不可少的功能。WebSocket是一种基于TCP的协议,它提供了双向通信的能力,使得实时通信变得更加容易。Node.js提供了一个内置的WebSocket模块,使得开发实时通信应用程序变得非常简单。在本文中,我将介绍如何在Node.js中使用WebSocket实

    2024年02月14日
    浏览(31)
  • ASP.NET Core 中使用 WebSocket 协议进行实时通信

    介绍 在 ASP.NET Core 中使用 WebSocket 协议创建实时通信的完整示例涉及几个步骤。在此示例中,我们将创建一个简单的聊天应用程序,用户可以在其中实时发送和接收消息。此示例假设您对 ASP.NET Core 和 C# 有基本了解。 步骤1.创建一个新的ASP.NET Core项目 首先,使用 Visual Studio 或

    2024年01月25日
    浏览(32)
  • Java-WebSocket通信 实现根据查询条件主动实时回传数据给前端&List<Map<String, Object>>转JSON编码器&WebSocket无法注册Bean问题解决方案

    项目背景:Java环境,Get请求根据前端查询条件建立WebSocket连接,每5秒主动实时推送最新查询结果给前端展示。其中也遇到定时器、WebSocket无法注册Bean、No encoder specified for object of class [class java.util.xxx]等问题,相关解决方案也有列举~ Web Sockets 的是在一个单独的持久连接上提

    2024年02月04日
    浏览(35)
  • websocket实时通讯和socket.io实时通信库的使用;心跳机制与断线重连

    https://zh.javascript.info/websocket WebSocket 是一种网络通信协议,就类似于 HTTP 也是一种通信协议。 为什么需要 WebSocket? 因为 HTTP 协议有一个缺陷:通信只能由客户端发起。 代码解析: 创建WebSocket实例:通过 new WebSocket() 创建一个WebSocket实例。在括号中传入服务器的URL,该URL指定了

    2024年02月16日
    浏览(31)
  • 如何使用websocket+node.js实现pc后台与小程序端实时通信

    实现功能:实现pc后台与小程序端互发通信能够实时检测到 1.安装ws依赖 2.创建index.js 3.打开终端,启动服务 这里是手动点击连接按钮,发起的websocket连接,可自行更改到其他合适的地方连接websocket 1.创建两个按钮,连接按钮,发送按钮 2.定义事件,连接ws

    2024年02月03日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包