vue3中使用websocket

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

效果图
vue3中使用websocket
实现
src/util/socket.ts

let websock: any = null;
let global_callback: any = null;
const serverPort = "8080"; // webSocket连接端口
const wsuri = "ws://" + window.location.hostname + ":" + serverPort + "/wsdemo";
function createWebSocket(callback: any) {
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
  // @ts-ignore
  if (websock == null || typeof websock !== WebSocket) {
    initWebSocket(callback);
  }
}
function initWebSocket(callback: any) {
  global_callback = callback;
  // 初始化websocket
  websock = new WebSocket(wsuri);
  websock.onmessage = function (e: any) {
    websocketonmessage(e);
  };
  websock.onclose = function (e: any) {
    websocketclose(e);
  };
  websock.onopen = function () {
    // eslint-disable-next-line @typescript-eslint/ban-ts-comment
    // @ts-ignore
    websocketOpen();
  };
  // 连接发生错误的回调方法
  websock.onerror = function () {
    console.log("WebSocket连接发生错误");
    //createWebSocket();啊,发现这样写会创建多个连接,加延时也不行
  };
}
// 实际调用的方法
function sendSock(agentData: any) {
  if (websock.readyState === websock.OPEN) {
    // 若是ws开启状态
    websocketsend(agentData);
  } else if (websock.readyState === websock.CONNECTING) {
    // 若是 正在开启状态,则等待1s后重新调用
    setTimeout(function () {
      sendSock(agentData);
    }, 1000);
  } else {
    // 若未开启 ,则等待1s后重新调用
    setTimeout(function () {
      sendSock(agentData);
    }, 1000);
  }
}
function closeSock() {
  websock.close();
}
// 数据接收
function websocketonmessage(msg: any) {
  // console.log("收到数据:"+JSON.parse(e.data));
  // console.log("收到数据:"+msg);
  // global_callback(JSON.parse(msg.data));
  // 收到信息为Blob类型时
  let result: any = null;
  // debugger
  if (msg.data instanceof Blob) {
    const reader = new FileReader();
    reader.readAsText(msg.data, "UTF-8");
    reader.onload = (e: any) => {
      console.log(e);
      if (typeof reader.result === "string") {
        result = JSON.parse(reader.result);
      }
      //console.log("websocket收到", result);
      global_callback(result);
    };
  } else {
    result = JSON.parse(msg.data);
    //console.log("websocket收到", result);
    global_callback(result);
  }
}
// 数据发送
function websocketsend(agentData: any) {
  console.log("发送数据:" + agentData);
  websock.send(agentData);
}
// 关闭
function websocketclose(e: any) {
  console.log("connection closed (" + e.code + ")");
}
function websocketOpen(e: any) {
  console.log(e);
  console.log("连接打开");
}
export { sendSock, createWebSocket, closeSock };

src/store/webSocket.ts

import { defineStore } from "pinia";

export const webSocketStore = defineStore("webSocket", {
  state: () => ({
    //推送消息
    data: [],
  }),
  getters: {},

  actions: {
    addMsg(val: any) {
      // eslint-disable-next-line @typescript-eslint/ban-ts-comment
      // @ts-ignore
      this.data.push(val);
    },
  },
});

这里面放到了登录成功后在连接websocket
src/viwes/login.vue

<script setup lang="ts">
import { colorStore } from "@/store/color";
import { webSocketStore } from "@/store/webSocket";
import { createWebSocket } from "@/util/socket";
import { useRouter } from "vue-router";
import md5 from "js-md5"; //
import { ref } from "vue";
import loginApi from "@/api/loginApi";
import { ElNotification } from "element-plus";
const color = colorStore();
const webSocket = webSocketStore();
const routers = useRouter();
const username = ref("009999");
const password = ref("0");
const mes = ref();
const global_callback = (msg: any) => {
  console.log("websocket的回调函数收到服务器信息:" + JSON.stringify(msg));
  // console.log("收到服务器信息:" + msg);
  mes.value = JSON.parse(JSON.stringify(msg));
  webSocket.addMsg(mes);
  ElNotification({
    title: "您有一条新的消息y",
    message: mes.value.key,
    position: "bottom-right",
  });
};
const login = () => {
  let params = {
    staffCode: username.value,
    password: md5(password.value.toString()),
  };
  loginApi.login(params).then((res: any) => {
    if (res) {
      sessionStorage.setItem("organizationCode", res.hospitalCode);
      sessionStorage.setItem("token", res.token);
      sessionStorage.setItem("staffCode", res.staffCode);
      sessionStorage.setItem("staffName", res.name);
      sessionStorage.setItem("islogin", "true");
      sessionStorage.setItem("roleList", JSON.stringify(res.roles));
      sessionStorage.setItem("currectRole", JSON.stringify(res.roles[0]));
      loginApi.queryMenuByRoleCode(res.roles[0].roleCode).then((res: any) => {
        if (res) {
          sessionStorage.setItem("menu", JSON.stringify(res));
          routers.push("/");
        }
      });
      createWebSocket(global_callback);
    }
  });
};
</script>

<template>
  <div class="con" :style="{ '--color': color.color }">
    <div id="box" class="login-container">
      <div class="left-container">
        <div class="title">
          <span>
            <img src="../../assets/hip.png" style="height: 15px" />{{
              $t("base.title")
            }}</span
          >
        </div>
        <div class="input-container">
          <input
            type="text"
            name="username"
            placeholder="用户名"
            v-model="username"
          />
          <input
            type="password"
            name="password"
            placeholder="密码"
            v-model="password"
          />
        </div>
        <div class="message-container">
          <span>Copyright © 2022 | {{ $t("login.GoodWill") }}</span>
        </div>
      </div>
      <div class="right-container">
        <div class="regist-container">
          <span class="regist">{{ $t("login.WelcomeLogin") }}</span>
        </div>
        <div class="action-container" @click="login">
          <span>{{ $t("login.submit") }}</span>
        </div>
      </div>
    </div>
  </div>
</template>

<style lang="scss" scoped>
.con {
  height: calc(100vh - 230px);
  padding-top: 10%;
  background-image: linear-gradient(
    to bottom right,
    rgb(114, 135, 254),
    var(--color)
  );
}
.login-container {
  width: 600px;
  height: 315px;
  margin: 0 auto;
  border-radius: 15px;
  box-shadow: 0 10px 50px 0px rbg(59, 45, 159);
  background-color: rgb(95, 76, 194);
}
#box {
  // outline: 4px solid #fff;
  position: relative;
  overflow: hidden;
  z-index: 1;
}
#box::before {
  content: "";
  position: absolute;
  background: lightgray;
  width: 500px;
  height: 400px;
  z-index: -2;
  left: 50%;
  top: 50%;
  transform-origin: 0 0;
  animation: rotate 5s infinite linear;
}
#box::after {
  content: "";
  position: absolute;
  background: rgb(95, 76, 194);
  width: calc(600px - 4px);
  height: calc(315px - 4px);
  left: 2px;
  top: 2px;
  border-radius: 15px;
  z-index: -1;
}
@keyframes rotate {
  to {
    transform: rotate(1turn);
  }
}
.left-container {
  display: inline-block;
  width: 330px;
  // height: 315px;
  height: 191px;
  margin-top: 2px;
  border-top-left-radius: 15px;
  border-bottom-left-radius: 15px;
  padding: 60px;
  background-image: linear-gradient(
    to bottom right,
    rgb(118, 76, 163),
    rgb(92, 103, 211)
  );
}
.left-container::before {
  content: "";
  width: 200px;
  height: 200px;
  left: 50%;
  top: 50%;
  z-index: -1;
  background-image: linear-gradient(
    to bottom right,
    rgb(118, 76, 163),
    rgb(92, 103, 211)
  );
}
.title {
  color: #fff;
  font-size: 18px;
  font-weight: 200;
}
.title span {
  border-bottom: 3px solid rgb(237, 221, 22);
}
.input-container {
  padding: 20px 0;
}
input {
  border: 0;
  background: none;
  outline: none;
  color: #fff;
  margin: 20px 0;
  display: block;
  width: 100%;
  padding: 5px 0;
  transition: 0.2s;
  border-bottom: 1px solid rgb(199, 191, 219);
}
input:hover {
  border-bottom-color: #fff;
}
::-webkit-input-placeholder {
  color: rgb(199, 191, 219);
}
.message-container {
  font-size: 14px;
  transition: 0.2s;
  color: rgb(199, 191, 219);
  cursor: pointer;
}
.message-container:hover {
  color: #fff;
}
.right-container {
  width: 145px;
  display: inline-block;
  height: calc(100% - 120px);
  vertical-align: top;
  padding: 60px 0;
}
.regist-container {
  text-align: center;
  color: #fff;
  font-size: 18px;
  font-weight: 200;
}
.regist-container span {
  border-bottom: 3px solid rgb(237, 221, 22);
}
.action-container {
  font-size: 10px;
  color: #fff;
  text-align: center;
  position: relative;
  top: 200px;
}
.action-container span {
  border: 1px solid rgb(237, 221, 22);
  padding: 10px;
  display: inline;
  line-height: 20px;
  border-radius: 20px;
  position: absolute;
  bottom: 10px;
  left: calc(72px - 20px);
  transition: 0.2s;
  cursor: pointer;
}
.action-container span:hover {
  background-color: rgb(237, 221, 22);
  color: rgb(95, 76, 194);
}
</style>

附赠后台建议websocket服务供测试使用
链接:https://pan.baidu.com/s/1RzbWiooLwCIuDTnEfN_x0Q?pwd=p58w
提取码:p58w文章来源地址https://www.toymoban.com/news/detail-508643.html

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

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

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

相关文章

  • 小程序自定义底部导航 custom-tab-bar完整实现代码附效果图

    根据用户身份,动态设置底部的导航图标  实现步骤: 第一步 ,先配置:app.json里面的 tabBar 的 custom 设置为 true,如图:这里需要注意的是,自定义 tabBar 中包含的页面,在这里的 list 页面路径也必须得有,其它字段可以不设置 相关代码:   第二步 ,创建组件:在项目跟目

    2024年02月15日
    浏览(53)
  • 基于python天津二手房数据爬虫采集系统设计与实现(django框架)带效果图

     博主介绍 :黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程,免费 项目配有对应开发文档、开题报告、任务书、

    2024年02月03日
    浏览(52)
  • 如何使用Midjourney辅助建筑平面设计和室内设计,常用的建筑平面效果图提示和使用效果展示(内附Midjourney提示词网站)

    Midjourney使用要的参数描述: --s :表示生成过程倾向于模型默认样式的程度(范围为0-1000,默认值为100) --seed — 保持生成一致 :: — 优先级和优先级的提示部分 --no (negative prompts) — 明确你不想要什么 --ar :设置宽高比。—16:9(风景)和—9:16(人像)适用于建筑摄影图像。在摄影中

    2024年02月06日
    浏览(57)
  • 最强AI软件教程来了!教你如何使用stable diffusion快速出景观建筑效果图

    Stable Diffusion效果图教程 要说哪款AI软件最适合建筑设计类?那必然是midjourney和Stable Diffusion!之前我们也看到了他们生成的图虽然很漂亮,但现有阶段md生成图对我们建筑景观类把控不是很友好,而且md属于收费软件,所以今天我们主要介绍Stable Diffusion(后简称SD)的一些用法。

    2024年04月10日
    浏览(86)
  • 3d建模渲染效果图步骤

    3dmax效果图的制作流程主要包括建模、渲染设置、灯光、材质贴图、摄影机和环境、渲染6大步骤。 在3dmax中想要制作出效果图,首先需要在场景中制作出3D模型,这个过程就叫做“建模”。建模有很多方式,比如通过3dmax内置的几何体创建立方体、球体等常见几何形体,利用多

    2024年02月09日
    浏览(45)
  • 20230514-SmartChat测试效果图

    E:20230514-SmartChat测试效果图 您好,我是SmartChat,新生代智能机器人,通过运用自然语言处理、机器学习和人工智能等高精尖技术,可以与您进行自然、流畅、有趣的对话,帮助您获取所需的信息和服务。无论您想要写商业计划书、营销策划,还是写作文、写周报、解数学题等

    2024年02月04日
    浏览(64)
  • Vray渲染效果图材质参数设置

    渲染是创造出引人入胜视觉效果的关键步骤,在视觉艺术领域尤为重要。不过,渲染作为一个资源密集型的过程,每当面对它时,我们往往都会遭遇到时间消耗和资源利用的巨大挑战。幸运的是,有几种方法能够帮助我们优化渲染,使之既高效又经济。例如,通过掌握一些渲

    2024年01月20日
    浏览(65)
  • AIGC 360全景图 效果图材质替换

    首先感叹一下AIGC的效果,如下图所示 AUTOMATIC1111 WebUI Prompts Positive and Negative提示词 LoRa 插件 LoRa: LatentLabs360 on CivitAI ControlNet 插件 Deep-checkpoints模型文件地址 Lora-Script 训练脚本 Panorama-Viewer查看全景图插件 网络问题自己搭梯子,一些安装环境可以调整(gradio==3.16.2) 感谢 秋葉

    2024年02月09日
    浏览(55)
  • 利用ArcGIS Pro制作三维效果图

    1、新建工程 打开Arcgispro,新建工程,这里我们要用到的模板为全局场景。 这里添加的数据需要有一个字段内容是数值的,这个字段也是接下来要进行拉伸的字段。 3、高度拉伸 数据添加进来后,如下图所示,这时图层处于2D图层里。 这时我们点中该图层,回到菜单栏,点击

    2024年02月16日
    浏览(58)
  • 数据可视化:随时间变化的效果图

    获取北京、上海、江苏、广东四省的2008—2012年的GDP数据 在Jupyter Notebook上实现代码如下:

    2023年04月12日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包