vue websocket 实现客服聊天功能(基础实现)

2023-10-31

本文章主要介绍如何实现一个基本的聊天,后续会添加表情包,传照片等功能。

其实刚开始接触的时候,我最大的疑惑是聊天功能的前期是否需要搭建什么框架、下载一些什么东西之类的,结果就是,其实websocket可以直接使用,然后前后端搭配,也是免费的,暂时没发现需要收费功能的东西~ 能帮到你就赶紧点个赞啦~O>.O

实现效果图~
在这里插入图片描述

首先封装一个websocket.js文件(大家可以直接复制,然后把接收/发送数据之类的格式改成自己的就可以啦)

import store from '@/store'
var webSocket = null;
var globalCallback = null;//定义外部接收数据的回调函数

//初始化websocket
export function initWebSocket (url) {
  //判断浏览器是否支持websocket
  if ("WebSocket" in window) {
    webSocket = new WebSocket(url);//创建socket对象
  } else {
    alert("该浏览器不支持websocket!");
  }
  //打开
  webSocket.onopen = function () {
    webSocketOpen();
  };
  //收信
  webSocket.onmessage = function (msg) {
    webSocketOnMessage(msg);
  };
  //关闭
  webSocket.onclose = function () {
    webSocketClose();
  };
  //连接发生错误的回调方法
  webSocket.onerror = function () {
    console.log("WebSocket连接发生错误");
  };
}

//连接socket建立时触发
export function webSocketOpen () {
  console.log("WebSocket连接成功");
}

//客户端接收服务端数据时触发,e为接受的数据对象
export function webSocketOnMessage (e) {
  // 存储在store中,然后在聊天界面中监控变化 自动拿取收到的信息
  store.commit('user/SET_WS_MSG', e)
}

//发送数据
export function webSocketSend (data) {
  console.log('发送数据');
  //在这里根据后端需要来转换数据格式
  webSocket.send(JSON.stringify(data));
}

//关闭socket
export function webSocketClose () {
  webSocket.close()
  console.log("对话连接已关闭");
  // }
}


//在其他需要socket地方调用的函数,用来发送数据及接受数据
export function sendSock (agentData, callback) {
  globalCallback = callback;//此callback为在其他地方调用时定义的接收socket数据的函数,此关重要。
  //下面的判断主要是考虑到socket连接可能中断或者其他的因素,可以重新发送此条消息。
  switch (webSocket.readyState) {
    //CONNECTING:值为0,表示正在连接。
    case webSocket.CONNECTING:
      setTimeout(function () {
        console.log('正在连接。。。');
        webSocketSend(agentData, callback);
      }, 1000);
      break;
    //OPEN:值为1,表示连接成功,可以通信了。
    case webSocket.OPEN:
      console.log('连接成功');
      webSocketSend(agentData);
      break;
    //CLOSING:值为2,表示连接正在关闭。
    case webSocket.CLOSING:
      setTimeout(function () {
        console.log('连接关闭中');
        webSocketSend(agentData, callback);
      }, 1000);
      break;
    //CLOSED:值为3,表示连接已经关闭,或者打开连接失败。
    case webSocket.CLOSED:
      console.log('连接关闭/打开失败');
      // do something
      break;
    default:
      // this never happens
      break;
  }
}

//将初始化socket函数、发送(接收)数据的函数、关闭连接的函数export出去
export default {
  initWebSocket,
  webSocketClose,
  sendSock
};

在vuex中定义存储下接收的数据
store/modules/user.js

let state = {
	webSocketMsg: ''
};

//修改state
const mutations = {
    // 存储websocket推送的消息
    SET_WS_MSG: (state, msg) => {
        state.webSocketMsg = msg
    }
}
//提交异动mutations。 如果在接受块出现问题,可以把这个加上去看看
//const actions = {
 //   webSockets ({ commit }) {
 //      commit('SET_WS_MSG', 2)
 //   }
//}

store/getters.js

//获取state的状态
const getters = {
    webSocketMsg: state => state.user.webSocketMsg
}

export default getters

然后在聊天界面中开始使用啦 websocket.vue

<script>
import { initWebSocket, sendSock, webSocketClose } from '@/utils/websocket.js'
export default {
  data() {
    return {
     // 这个地址是后端给的,用来连接websocket。 加密wss 未加密ws
      wsUrl:'ws://地址',
    }
  },
  // 从store中获取接收到的信息
  computed: {
    getSocketMsg() {
      return this.$store.state.user.webSocketMsg
    },
  },
  //监控 getSocketMsg 是否有接收到数据
  watch: {
    getSocketMsg: {
      handler: function (val) {
        this.getConfigResult(val)
      },
    },
    //这一步是我对我聊天框的css设计,大家可以不用写,需要的时候再参考。
    //我将接收到的信息和发出的信息都存储到obList中,然后通过监控数值变化,使聊天定位始终位于底部(css中 overflow: auto;)
    obList: {
      handler: function (val) {
        this.$nextTick(() => {
          this.$refs.chatContent.scrollTop = this.$refs.chatContent.scrollHeight
        })
      },
    },
    immediate: true,
  },
  methods: {
    // 点击按钮-建立聊天连接
    customerDialog() {
      initWebSocket(this.wsUrl)
    },
    // 接收socket回调函数返回数据的方法,这个函数是我在监控接受数据的时候调用的(上面的watch中)
    getConfigResult(val) { },

	// 点击发送按钮 发送信息---发送信息的格式要和后端确认
    sending() {
      sendSock('发送的信息')
    },
    // 处理聊天框关闭事件
    handleClose() {
     //关闭连接
      webSocketClose()
    },
  },
}
</script>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue websocket 实现客服聊天功能(基础实现) 的相关文章

随机推荐

  • Redis面试题 (2023最新版)

    文章目录 一 Redis为什么快 1 纯内存访问 2 单线程 避免上下文切换 3 渐进式ReHash 缓存时间戳 1 渐进式ReHash 2 缓存时间戳 二 Redis合适的应用场景 常用基本数据类型 5种 1 字符串 String 1 缓
  • CSS_文字渐变

    定义渐变背景样式 gradient text background image linear gradient to right ff0000 00ff00 渐变色范围 background clip text 应用渐变背景到文本 webk
  • VS2022 CMake报错解决小结

    目录 一 问题背景 二 问题分析 三 问题解决 一 问题背景 VS2022中能够跨平台的工程类型就是CMake项目 一套代码能跨windows Linux Mac多种操作系统 而实际使用时 发现相关资料比较少 需要摸索一下 碰到的问题简述
  • STM32 DMA+ADC连续采样产生的内部噪声和解决办法

    本文讨论的是内部采样频率过高而产生的噪声 DMA ADC连续采样 DMA发送完成产生中断后继续开启ADC转换 如下图中ADC Value数组中出现异常数据 DMA ADC 1ms 间隔采样 异常数据消失 电压12 22 电阻分压系数 4 0
  • javaMail SMTPSendFailedException: java邮件发送常见的异常类型

    421 HL REP 该IP发送行为异常 存在接收者大量不存在情况 被临时禁止连接 请检查是否有用户发送病毒或者垃圾邮件 并核对发送列表有效性 421 HL ICC 该IP同时并发连接数过大 超过了网易的限制 被临时禁止连接 请检查是否有用
  • 【Linux入门指北】第六篇 Linux常用的开发工具

    文章目录 前言 一 Linux编辑器 vi vim 1 vi vim介绍 2 vi vim 各种模式间的相互切换 3 一般模式 4 编辑模式 4 命令行模式 二 Linux软件包管理器 yum RPM 1 yum介绍 2 YUM本地源 系统
  • JavaEE-制作JSTL标签 详解

    使用定制标签库使得JSP程序更加简洁 可读性和可维护性大大的提高了 因此JSP定制标签的优势是非常明显的 它被认为是JSP所有特性中最被看好的特性 我们要编写一个标签 向请求者的浏览器输出 Hello World 同时该标签是一个没有体内容
  • 红队渗透靶场之W1R3S靶场(超详细!)

    W1R3S考察知识 nmap的基本使用 目录爆破工具的使用 CMS漏洞的利用 Linux用户的简单提权 W1R3S靶场搭建 W1R3S靶场下载地址 https download vulnhub com w1r3s w1r3s v1 0 1
  • 用Python做一个简单的视频播放器

    相关文件 关注小编 私信小编领取就好啦 开发工具 Python版本 3 7 8 相关模块 pyqt5模块 以及一些python自带的模块 搭建环境 安装Python并添加到环境变量 pip安装需要的相关模块即可 原理介绍 这里我们主要利用P
  • LLVM IR 即 LLVM Language Reference Manual 15 翻译: 001节

    Abstract This document is a reference manual for the LLVM assembly language LLVM is a Static Single Assignment SSA based
  • 实例六个,八段代码,详解Python中的for循环

    Python 支持循环 它的语法与其他语言 如 JavaScript 或 Java 有些不同 下面的代码块演示如何在 Python 中使用for循环来遍历列表中的元素 下面的这段代码可以通过行替换的行来指定打印的 你在打印的 将输出显示在同
  • html文本中加空格的四种方式

    一 使用 nbsp 这种是不换行空格 会一直累加到后面 缺点是会受到字体宽度的影响 很明显 两个 nbsp 邓等于一个中文宽度 二 使用 emsp 推荐使用这种方式 同样是不换行空格 可以一直累加的同时所占的宽度正好是一个汉字 而且受字体宽
  • 获取英雄联盟全皮肤(极速版)

    如何实现英雄联盟全皮肤 话接上回 虽然我们能获得全皮肤 但是呢 速度确实是有点慢 但是没关系 这次小编就带着大家给爬虫提提速 首先 我们要明白怎么给爬虫加速 这就要提到多进程和多线程了 多进程 1 多进程 一个应用程序默认有一个进程 主进程
  • 如何完全、干净地卸载Oracle 11g数据库?

    移除Oracle 11g Oracle 11g的卸载过程分为停掉服务 卸载Oracle产品 删除注册表项 删除环境变量和重启计算机5个步骤 1 1 停止服务列表的五 六 个服务 按win r 在 运行 框中输入services msx命令
  • CentOS8服务篇8:NFS服务器配置与管理

    一 安装NFS服务器 进入到超级用户 执行 yum y install nfs utils rpcbind 就开始安装NFS和RPC了 二 关闭服务器防火墙 systemctl stop firewalld 三 临时关闭SELinux se
  • Rancher2.x的安装与使用入门

    Rancher2 x的安装与使用入门 文章目录 Rancher2 x的安装与使用入门 一 Rancher简介 二 Rancher安装 1 机器准备 2 docker安装 3 Rancher安装 三 Web设置 四 使用RKE构建K8S集群
  • rabbitMQ无法发送消息问题

    今天查看rabbitmq的管理平台 发现connection处于blocked状态 队列无法接受消息 后面发现是内存满了 清了下内存正常了
  • 计算机科学书籍

    下面开始详细了解下书籍 1 计算机程序的构造和解释 数据科学家告诉你哪些计算机科学书籍是你应该看的 麻省理工已经不再使用这本书来教计算机科学导论了 用Python替代Scheme 而Scheme是这本书使用的语言 这背后的原因可能是这个世界
  • Redis 学习笔记(一)-- Redis 基础知识

    Redis 上篇 Linux学习 1 什么是NoSQL 百度百科 https baike baidu com item NoSQL 8828247 fr aladdin NoSQL Not Only SQL 泛指非关系型的数据库 区别于关系
  • vue websocket 实现客服聊天功能(基础实现)

    本文章主要介绍如何实现一个基本的聊天 后续会添加表情包 传照片等功能 其实刚开始接触的时候 我最大的疑惑是聊天功能的前期是否需要搭建什么框架 下载一些什么东西之类的 结果就是 其实websocket可以直接使用 然后前后端搭配 也是免费的