【基于VUE的实时聊天(私聊)】

【基于VUE的实时聊天(私聊)】对于一个大厅实时聊天我们都看惯不惯了 花了一天的时间结合 nodejs websocket 和 vue 做了一个实时私聊的插件 当然代码方面有待改善 nbsp 现在简要讲解一下我的思路一 规范传输我的项目经验不多 但我觉得每个项目都要现设立一些规则 如果随心所欲的可能会导致自己跳到自己的坑 我们先设定项目的 json 传输规定 获取 uid type welcome my id

【基于VUE的实时聊天(私聊)】

对于一个大厅实时聊天我们都看惯不惯了,花了一天的时间结合nodejs-websocket和vue做了一个实时私聊的插件,当然代码方面有待改善。

 现在简要讲解一下我的思路

一、规范传输

我的项目经验不多,但我觉得每个项目都要现设立一些规则,如果随心所欲的可能会导致自己跳到自己的坑。

我们先设定项目的json传输规定

//获取uid {type:'welcome',my_id:'我的uid'} //获取成员 {type:'member',members:['成员1','成员1']} //对话信息 {type:'chat',from:'来自uid',to:'发给uid',msg:'对话信息'}

二、服务器业务逻辑

// npm i nodejs-websocket let ws = require("nodejs-websocket") //str转json let json = str => { return (new Function('return '+str))() } //json转str let str = json =>{ return JSON.stringify(json) } // 实时聊天人数数组,通过随机数生成 let conns = [], message_welcome = {}, message_member = {}, message_between = {}, heart_beat = 9999, //要求每个连接每9999秒心跳一次,否则断线,建议调到50 let server = ws.createServer(function (conn) { //根据时间戳生成用户id uid let uid = str((new Date()).getTime()).slice(-6) //计算心跳时间 conn.heart_time = 0 let timer = setInterval(()=>{ if (conn.heart_time > heart_beat) { clearInterval(timer); conn.close() } conn.heart_time++ },1000) //保存用户id在全局数组conns中方便我们处理聊天对象信息 conns[uid] = conn message_welcome = {'my_id':uid,type:'welcome'} conn.sendText(str(message_welcome)) //如果有新的人员加入,广播数据给全部人 message_member = {'members':Object.keys(conns),type:'member'} for(var i in conns){ conns[i].sendText(str(message_member)) } //接受到发过来的信息 conn.on("text", function (text) { //重置心跳 conn.heart_time = 0 //判断发给谁 console.log(text) let data = json(text), to = data['to'], from = uid, msg = data['msg'] //存在发送的对象 console.log(str(Object.keys(conns)),to) if (Object.keys(conns).indexOf(to) != -1) { message_between = {type:'chat','from':from,'to':to,'msg':msg} console.log(str(message_between)) //发给别人 conns[to].sendText(str(message_between)) //发给自己 conns[from].sendText(str(message_between)) } }) //断开连接的回调 conn.on("close", function (code, reason) { //删除成员信息 delete conns[uid] //广播 message = {'members':Object.keys(conns),type:'member'} for(var i in conns){ conns[i].sendText(str(message_member)) } }) //处理错误事件信息 conn.on('error', function (err) { //异常conn就直接删除 conn.close() delete conns[uid] }) }).listen(8001);//8001端口 

三、vuex管理websocket

因为websocket在项目中通常一个足以。所以直接扔给vuex比较稳。

我没有用onclose判断websocket状态,我改用WebSocket.readyState    (0:正在连接,1:已连接,2:关闭中,3:已关闭)

因为这样的状态更深刻体现webscoket的状态。

import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) // str转json let json = str => { return (new Function('return '+str))() } //json转str let str = json =>{ return JSON.stringify(json) } export default new Vuex.Store({ state: { WS:false,//websocket对象 WS_URL:'ws://127.0.0.1:8001', WS_RECONNECT:false,//自动重连 // HEART_BEAT:5,//每50秒心跳一次 HEART_MSG:'hello', }, mutations: { SOCKET_INIT(state,config={}){ if (!state.WS) { state.WS = new WebSocket(state.WS_URL) } for(var i in config){ state[i] = config[i] } }, SOCKET_MESSAGE(state,func){ return new Promise((resolve,reject)=>{ state.WS.onmessage=(data)=>{ // data = (new Function('return '+data))() resolve(func(json(data.data))) } //这个有问题,虽然很方便,但还是搁置 // state.WS.addEventListener('message',data=>{resolve(func(data))}) }) }, SOCKET_SEND(msg){ state.WS.send(str(msg)) }, SOCKET_HEART(state){ //设置心跳 if (state.HEART_BEAT > 0) { let timer = setInterval(()=>{ state.WS.send(state.HEART_MSG) //如果已经关闭就停止 if([2,3].indexOf(state.WS.readyState) !== -1){ clearInterval(timer) } },parseInt(state.HEART_BEAT)*1000) } } }, getters:{ }, actions: { SOCKET_INIT({state,commit},func){ return new Promise((resolve,reject)=>{ commit('SOCKET_INIT') state.WS.onerror = function (msg) { reject(msg) } let timer = setInterval(()=>{ //不是正在连接状态 if(state.WS.readyState!==0){ clearInterval(timer) //正在关闭,关闭 if([2,3].indexOf(state.WS.readyState) !== -1){ state.WS = false } //连接 if(state.WS.readyState===1){ resolve(state.WS) commit('SOCKET_HEART') commit('SOCKET_MESSAGE',func) } } },100) }) }, } }) 

四、调用webscoket

import { mapActions,mapState } from 'vuex' export default { name: 'vue-chat', computed:{ //websocket实例 ...mapState({'WS':'WS'}), }, methods:{ ...mapActions({socket:'SOCKET_INIT'}), sendMsg(str){ this.WS.send(str) }, handle_message(data){ //因为我在vuex中直接将其数据变为json,所以直接可以用 console.log(data) } } //一般直接放在加载完成的时候 mounted(){ let that = this //接受信息的时候 this.socket((data)=>{ that.handle_message(data) }) } }

git 代码:https://github.com/JeasonLaung/vue-chat

如果你觉得好,帮我star一个,谢谢大家

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/178925.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午4:13
下一篇 2026年3月26日 下午4:13


相关推荐

  • Wireshark网络流量分析工具

    Wireshark网络流量分析工具Wireshark网络流量分析工具安装使用yum安装wireshark遇到的问题http://blog.chinaunix.net/uid-11828817-id-2816828.htmlrpm-qawireshark#yuminstall-ywiresharkwireshark-gnome…

    2022年5月24日
    43
  • Nginx命令大全[通俗易懂]

    nginx #打开nginxnginx-t   #测试配置文件是否有语法错误nginx-sreopen #重启Nginxnginx-sreload  #重新加载Nginx配置文件,然后以优雅的方式重启Nginxnginx-sstop  #强制停止Nginx服务nginx-squit  #优雅地停止Nginx服务…

    2022年4月13日
    46
  • GEE平台 landsat8影像全波段下载

    GEE平台 landsat8影像全波段下载//选择Landsat8SR数据集varl8=ee.ImageCollection(“LANDSAT/LC08/C01/T1_SR”)Map.centerObject(roi,8);//Landsat8SR数据去云functionrmL8Cloud(image){varcloudShadowBitMask=(1<<3);varcloudsBitMask=(1<<5);varqa=imag…

    2022年7月23日
    49
  • 用html编写或在dw中完成,Dreamweaver教程-在 Dreamweaver 中编写 HTML 代码[通俗易懂]

    用html编写或在dw中完成,Dreamweaver教程-在 Dreamweaver 中编写 HTML 代码[通俗易懂]Dreamweaver教程-在Dreamweaver中编写HTML代码,代码,教程,标签,光标,文本Dreamweaver教程-在Dreamweaver中编写HTML代码易采站长站,站长之家为您整理了Dreamweaver教程-在Dreamweaver中编写HTML代码的相关内容。1.启动DreamweaverCS52.点击左上角的“文件”>“新建”。3.在“新…

    2022年5月2日
    46
  • kernel 动态修改dtb方案

    kernel 动态修改dtb方案DTB 是在 uboot 进 kernel 时 被 load 到内存中 然后在 linux 中 start kernel gt setup arch gt unflatten device tree 中 从内存中读取 展开成树型的数据结构 供内核驱动查找 一般来说 linux 中 不会对 dtb 做什么改动 但如果有特殊需求 想统一几个类似产品的不同配置 修改一些驱动参数 而又不想动 uboot 的话 一般 OTA 升级

    2026年3月17日
    2
  • 易玩卡盟怎么样_支付接口集成平台

    易玩卡盟怎么样_支付接口集成平台支持一键装修主站,一键对接货源,自定义后台登录背景,前台风格自定义背景等,已集成易支付接口对接易支付充值接口,修复BUG等服务器系统可以:Windows64/Linux64/cenos6.864位安装宝塔环境:apache2.4+mysql5.5+php5.6cenos6.8系统安装宝塔命令:yuminstall-ywgetamp;amp;wget-Oinstall.shhttp://downlo…

    2022年8月13日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号