聊天室 nodeJs + websocket + mysql 实操

聊天室 nodeJs + websocket + mysql 实操

来源:链接

说明

介绍聊天室,功能主要:实时对话 + 实时在线人数 + 查看历史记录 + 心跳检测。技术栈:

前端: vue3+ vite + typescript + vue-router4

后端:nodeJs + express + mysql + nginx + 阿里云

websocket API

// 连接const wsUrl: string = ref("")ws.value = new WebSocket(wsUrl.value)// 监听服务端的消息ws.value.onmessage = function (res: any) {  // to do something  const resData = JSON.parse(res.data)    }// 连接事件ws.value.onopen = function(res: any) {  // ElMessage({ "message": "连接成功,open", "type": "success" })}// 错误事件ws.value.onerror = function(res: any) {  // ElMessage({ "message": "连接出错了", "type": "error" })}// 连接端开事件ws.value.onclose = function(res: any) {  // ElMessage({ "message": "连接断开", "type": "warning" })}

示例:

const token: string = ref("")const ws: any = ref(null)const reConnectCountRange: number = ref(50) // 允许重连的次数const reConnectCount: number = ref(1) // 重连计数const heartCountRange: number = ref(3) // 允许心跳次数范围,超出时重连const heartCount: number = ref(1) // 心跳计数const heartTimer: any = ref(null)const wsUrl: string = ref("")function connectWs () {  pageIndex.value = 1  showLoading.value = false  wsUrl.value = `ws://xxxx:888/ws?token=${token.value}`;  if (!token.value) {    return false  }  ws.value = new WebSocket(wsUrl.value)  ws.value.onmessage = function (res: any) {    // console.log("message", JSON.parse(res.data))    const resData = JSON.parse(res.data)    reConnectCount.value = 1    if (resData.code === 200) {      if (resData.isCone === 0) {        pageTotal.value = resData.data.count        onlineCount.value = resData.userCount        chatList.value = resData.data.map((x: any) => {          x.createTime = formatLately(x.createTime)          return x        })      } else if (resData.isCone === 1) {        const x: any = resData.data        x.createTime = formatLately(x.createTime)        chatList.value.push(x)      }      scrollBottom()    } else if (resData.code === 100) {      heartCount.value = 1    } else if (resData.code === 500) {      onlineCount.value = resData.userCount    } else if (resData.code === 400) {      onlineCount.value = resData.userCount    }  }  // 心跳  heartMethod()  ws.value.onopen = function(res: any) {    // ElMessage({ "message": "连接成功,open", "type": "success" })  }  ws.value.onerror = function(res: any) {    // ElMessage({ "message": "连接出错了", "type": "error" })  }  ws.value.onclose = function(res: any) {    // ElMessage({ "message": "连接断开", "type": "warning" })  }}// 心跳检测function heartMethod() {  heartTimer.value = setInterval(() => {    if (heartCount.value < heartCountRange.value) {      if (ws.value) {        ws.value.send(JSON.stringify({ "code": 100, "msg": "前端的心跳请求" }))        heartCount.value++      }    } else {      ElMessage({ "message": "超出心跳次数, 准备重连!", "type": "warning" })      clearInterval(heartTimer.value)      if (ws.value) {        ws.value.close()        ws.value = null      }      heartCount.value = 1      // 限制重连次数      if (reConnectCount.value <= reConnectCountRange.value) {        connectWs()        reConnectCount.value++      } else {        ElMessageBox.confirm(          "超出重连次数",          "",          { "showConfirmButton": true, "showCancelButton": true, "confirmButtonText": "重连", "cancelButtonText": "取消", "type": "success" })          .then(() => {          reConnectCount.value = 1          connectWs()        })      }    }  }, 1000)}

项目地址链接

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部