使用vue3简单实现WebSocket通信

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

WebSocket是一种在客户端和服务器之间进行双向通信的网络协议。它通过建立持久性的、全双工的连接,允许服务器主动向客户端发送数据,而不需要客户端显式地发送请求。

关于WebSocket通信的简单介绍:

  1. 握手阶段:在建立WebSocket连接之前,客户端需要发送一个HTTP请求到服务器,请求升级为WebSocket协议。这个过程称为握手(Handshake)。如果服务器支持WebSocket协议,它将返回带有特定标头的HTTP响应,表示握手成功。
  2. 建立连接:客户端收到服务器的握手响应后,会重新建立连接。此时,连接将从HTTP协议切换到WebSocket协议,并保持打开状态。这样就建立了可持续的双向通信通道。
  3. 数据传输:一旦WebSocket连接建立,客户端和服务器可以开始互相发送消息。客户端和服务器都可以通过发送文本或二进制数据来通信。消息可以是简单的字符串,也可以是复杂的数据结构,如JSON对象等。
  4. 断开连接:当需要关闭WebSocket连接时,客户端或服务器可以主动发送一个关闭帧来断开连接。收到关闭帧的一方会结束连接并发送回应帧,完成连接的关闭。

WebSocket通信具有以下特点:

  • 实时性:由于WebSocket使用长连接,可以实时地将数据推送到客户端,而不需要显式地发送请求。这使得它非常适合需要快速、实时响应的应用程序。
  • 双向通信:WebSocket允许客户端和服务器之间双向传输消息。这意味着服务器可以主动向客户端推送数据,而不仅限于响应客户端的请求。
  • 较低的开销:相比于传统的轮询方式(每隔一段时间发送请求),WebSocket连接具有较低的开销。一旦建立连接,它只需要发送少量的数据头部信息,并且在保持连接时可以重复使用该连接。
  • 跨平台支持:WebSocket协议是一种标准化的协议,被广泛支持和应用于不同的平台和编程语言中。

通过使用WebSocket,开发人员可以实现实时通信、聊天应用、多人游戏、股票行情等需要及时交互和更新的应用程序。

1.相关代码如下:

①创建src/utils/websocket.ts文件

import { ElMessage } from 'element-plus'
import store from '../store'

let websocket: WebSocket | null = null; // 用于存储实例化后websocket
let rec: any; // 断线重连后,延迟5秒重新创建WebSocket连接  rec用来存储延迟请求的代码

// 创建websocket
function creatWebSocket(wsUrl: string) {
  console.log("websocket==================");
  // 判断当前浏览器是否支持WebSocket
  if ("WebSocket" in window) {
    console.log("当前浏览器支持 WebSocket");
  } else if ("MozWebSocket" in window) {
    console.log("当前浏览器支持 MozWebSocket");
  } else {
    console.log("当前浏览器不支持 WebSocket");
  }


  try {
    initWebSocket(wsUrl); // 初始化websocket连接
  } catch (e) {
    console.log("尝试创建连接失败");
    reConnect(wsUrl); // 如果无法连接上 webSocket 那么重新连接!可能会因为服务器重新部署,或者短暂断网等导致无法创建连接
  }
}



// 初始化websocket
function initWebSocket(wsUrl: string) {
  websocket = new WebSocket(wsUrl);
  console.log("websocket:", websocket);


  websocket.onopen = function () {
    websocketOpen();
  };


  //   // 接收
  websocket.onmessage = function (e: MessageEvent<any>) {
    websocketonmessage(e);
  };


  // 连接发生错误
  websocket.onerror = function () {
    console.log("WebSocket连接发生错误");
    //     isConnect = false; // 连接断开修改标识
    reConnect(wsUrl); // 连接错误 需要重连
  };


  websocket.onclose = function (e) {
    websocketclose(e);
  };
}



// 定义重连函数
let reConnect = (wsUrl: string) => {
  console.log("尝试重新连接");
  if (store.state.isConnected) return; // 如果已经连上就不在重连了
  rec && clearTimeout(rec);
  rec = setTimeout(function () {
    // 延迟5秒重连  避免过多次过频繁请求重连
    creatWebSocket(wsUrl);
  }, 5000);
};


// 创建连接
function websocketOpen() {
  console.log("连接成功");
  store.dispatch('connect'); // 修改连接状态
}
// 数据接收
function websocketonmessage(e: MessageEvent<any>) {
  console.log("数据接收", e.data);
  const data = JSON.parse(e.data);  // 解析JSON格式的数据
  // 下面的判断则是后台返回的接收到的数据  如何处理自己决定
  if (data.code === 400) {
    console.log("数据接收", data.msg);
    ElMessage({
      showClose: true,
      message: data.msg,
      type: 'warning',
    })


  } else if (data.code === 404) {
    ElMessage({
      showClose: true,
      message: data.msg,
      type: 'warning',
    })
  } else if (data.code === 0) {
    ElMessage({
      showClose: true,
      message: "连接成功",


      type: 'success',
    })
  } else if (data.code === 200) {
    ElMessage({
      showClose: true,
      message: data.msg,
      type: 'success',
    })
    // 成功后的相应处理  此处成功后播放音乐
    const audio = new Audio('./tipMusic.mp3');
    audio.play();
  } else {
    ElMessage({
      showClose: true,
      message: data.msg,
      type: 'error',
    })
    // 延时5秒后刷新页面
    setTimeout(() => {
      location.reload();
    }, 1000);
  }

  // let data = JSON.parse(decodeUnicode(e.data))
}



// 关闭
function websocketclose(e: any) {
  console.log(e);
  store.dispatch('disconnect'); // 修改连接状态
  console.log("connection closed (" + e.code + ")");
}



// 数据发送
function websocketsend(data: any) {
  console.log("发送的数据", data, JSON.stringify(data));
  if (websocket && store.state.isConnected) { // 检查连接状态
    websocket.send(JSON.stringify(data));
    
  } else {
    ElMessage({
      showClose: true,
      message: "请选择设备连接",
      type: 'error',
    })
  }
}


// 实际调用的方法==============

// 发送
function sendWebSocket(data: any) {
  // 如果未保持连接状态 不允许直接发送消息 提示请选择连接设备
  if (!store.state.isConnected) {
    ElMessage({
      showClose: true,
      message: "请选择设备连接",
      type: 'error',
    })


  } else {
    websocketsend(data);
    console.log("------------------");
    
  }
}


// 关闭
let closeWebSocket = () => {
  if (websocket) {
    websocket.close();
    ElMessage({
      showClose: true,
      message: "设备已关闭",
      type: 'success',
    })
  }
};


export {
  initWebSocket,
  sendWebSocket,
  creatWebSocket,
  closeWebSocket,
};

②全局保存连接状态src/store/index.ts

先安装npm install vuex

import { createStore } from 'vuex'
const store = createStore({
  state: {
    isConnected: false,//连接状态
  },
  mutations: {
    setConnected(state: any, isConnected: boolean) {
      state.isConnected = isConnected
    },
  },
  actions: {
    connect({ commit }: { commit: any }) {
      // 连接成功后,将 isConnected 状态设置为 true
      commit('setConnected', true)
    },
    disconnect({ commit }: { commit: any }) {
      // 断开连接或退出登录时,将 isConnected 状态设置为 false
      commit('setConnected', false)
    }
  }
})


export default store

③页面连接设备

<script setup lang="ts">
import { ref ,onMounted} from 'vue'
import { closeWebSocket,initWebSocket } from '../../utils/websocket'
import { useStore } from 'vuex';

const store = useStore()
//连接设备  (具体路径和后端规定)
function connectMsg() {
  const toIp = `ws://192.168.50.50:8822/websocket/ipad/${roomId.value}`;
  store.dispatch('connect')
  initWebSocket(toIp)
}

// 设备断开
function closeWs() {
  closeWebSocket()
  store.dispatch('disconnect')
}
</script>

<template>

<div class="connect">

          <el-button class="elbtn" @click="connectMsg">连接设备</el-button>

        <el-button class="elbtn" @click="closeWs">关闭设备</el-button>

        </div>

</template>

④发送消息给后端

<script setup lang="ts">
import {ref} from 'vue'
import { sendWebSocket } from '../../utils/websocket'
const courseTopic = ref('')
const courseGrowth = ref('')
const todayHaul = ref('')
const selectedTeacher = ref('')

//提交
const harvestSubmit = () => {
  // 要发送的数据  和后端定义格式
  const harvestData = {
    "HandlerType": "COURSEREFLECT",
    "topicReflect": courseTopic.value,
    "growReflect": courseGrowth.value,
    "harvest": todayHaul.value,
    "teacher": "李老师"
}
    console.log("提交反思与收获数据",harvestData); 
  // 发送消息给后端
    sendWebSocket(harvestData)
  
  }
</script>
<template>
        <div class="think">
          <p>课程反思</p>
        <el-input v-model="courseTopic" :rows="3" type="textarea" placeholder="主题课程" />
        <el-input v-model="courseGrowth" :rows="3" type="textarea" placeholder="适性成长课程" />
        <p>今日收获</p>
        <el-input v-model="todayHaul" :rows="3" type="textarea"  />
        </div>
        <div class="btn">
            <button @click="harvestSubmit"> 提交</button>
          </div>
    </template>

欢迎大家批评指正 谢谢 ~~文章来源地址https://www.toymoban.com/news/detail-601741.html

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

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

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

相关文章

  • 简单本地websocket运行实例(vue3)

    简单本地websocket运行实例(vue3)

    目录 1.完善一下登陆页面,方便后续使用 2.具体实现vue页面 3.hooks文件夹建立,存放websocket设置 4.建立src的同级server文件夹,用于后端启动websocket服务 5.创建index.js文件,编写websocket代码 6.在server目录下,通过npm run dev运行后端代码  7.效果展示 整体代码: 页面结构如图:  

    2024年02月06日
    浏览(13)
  • vue3+nodejs(websocket)实现监控拉rtsp流,使用flv.js+ffmpeg包(主要建立websocket是为了转码传流)

    vue3+nodejs(websocket)实现监控拉rtsp流,使用flv.js+ffmpeg包(主要建立websocket是为了转码传流)

    关于拉取监控摄像头的流,我个人去查了很多资料,也是因为之前没有接触过这一模块,加上目前公司也没有后端去写接口,所以我直接用node去写websocket,与前端建立起通信,能够进行后续转码、传流,能够实现实时播放监控画面。 这里的rtsp流是要事先知道的,监控的这个

    2024年02月20日
    浏览(17)
  • vue 实现 websocket 通信

    vue 实现 websocket 通信

    在vue中用websocket实现实时通信,通过设置心跳时间来监测连接是否存在,若心跳时间内并没接收到任何消息,将自动重连。 1. 什么是 WebSocket ? Websocket是一个持久化的网络通信协议 WebSocket 是HTML5 新增的的特性,(WebSocket 协议的本质上是一个基于tcp的协议) 它实现了浏览器与

    2024年01月22日
    浏览(7)
  • vue3 终端实现 (vue3+xterm+websocket)

    vue3 终端实现 (vue3+xterm+websocket)

      目录 一、xterm介绍 二、效果展示 三、vue文件实现代码 一、xterm介绍 xterm是一个使用 TypeScript 编写的前端终端组件,可以直接在浏览器中实现一个命令行终端应用,通常与 websocket 一起使用。 二、效果展示 三、vue文件实现代码

    2024年02月04日
    浏览(11)
  • vue3中使用websocket

    vue3中使用websocket

    效果图 实现 src/util/socket.ts src/store/webSocket.ts 这里面放到了登录成功后在连接websocket src/viwes/login.vue 附赠后台建议websocket服务供测试使用 链接:https://pan.baidu.com/s/1RzbWiooLwCIuDTnEfN_x0Q?pwd=p58w 提取码:p58w

    2024年02月11日
    浏览(10)
  • 前端实现websocket通信讲解(vue2框架)

    前端实现websocket通信讲解(vue2框架)

    前言 :最近接到的需求是前端需要实现一个全局告警弹窗,如果使用ajax请求http接口只能用定时器定时去请求是否有告警,这样既消耗资源,又不能实时监测到告警信息。所以这个时候就可以采用websocket来实现通信,因为websocket不用请求一次才响应一次,它可以实现服务器主

    2024年02月12日
    浏览(15)
  • vue3:websocket的封装与使用

    前言:vue3+pinia项目 1.引入ws 2.新建websocket.js类 3.新建一个pinia Store类 4.页面中使用

    2024年02月02日
    浏览(13)
  • 在vue3中封装使用WebSocket

    上篇文章记录了如何在日常开发过程中引入并使用websocket连接,但是在后续的开发过程中发现之前的写法有点问题,比如说多次引用连接会共用一个心跳,如果一个连接关掉了,后续其他的连接可能被一起关掉等等的bug。 所以在这篇文章里针对上篇文章提供的方法进行改进,

    2024年02月07日
    浏览(10)
  • vue3使用websocket(亲测解决)

    1.需要后端给你一个ws的接口比如: 我这里的name是后端要求登录成功后搞得 2.后端给我个登录的接口,需要登录后才能实现长链接 3.封装init方法 网上找了一堆没用的方法,不建议看 所有代码合集

    2024年02月14日
    浏览(10)
  • webSocket及使用webSocket实现实时聊天通信

    webSocket及使用webSocket实现实时聊天通信

    webSocket在开始的时候依旧使用的是http协议,只不过后面保持tcp持久链接,是一种全双工通信。webSockets和http很像,它的请求url用的是ws、wss,对应http、https 初始化 npm init -y 安装ws依赖 npm i --save ws 写服务器代码 服务器启动 node server.js 配置前端代码,即告诉浏览器这个请求不要

    2023年04月11日
    浏览(12)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包