位置: IT常识 - 正文

【node进阶】深入浅出websocket即时通讯(二)-实现简易的群聊&私聊(node实战)

编辑:rootadmin
【node进阶】深入浅出websocket即时通讯(二)-实现简易的群聊&私聊

推荐整理分享【node进阶】深入浅出websocket即时通讯(二)-实现简易的群聊&私聊(node实战),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:node实战,node基础知识,nodejs进阶,nodejs进阶,node 入门,nodejs进阶,nodejs进阶,nodejs 深入浅出,内容如对您有帮助,希望把文章链接给更多的朋友!

✅ 作者简介:一名普通本科大三的学生,致力于提高前端开发能力 ✨ 个人主页:前端小白在前进的主页 🔥 系列专栏 : node.js学习专栏 ⭐️ 个人社区 : 个人交流社区 🍀 学习格言: ☀️ 打不倒你的会使你更强!☀️ 💯 刷题网站:这段时间有许多的小伙伴在问有没有什么好的刷题网站,博主在这里给大家推荐一款刷题网站:👉点击访问牛客网👈牛客网支持多种编程语言的学习,各大互联网大厂面试真题,从基础到拔高,快来体验一下吧!

🔥前言

相信在上一篇的文章中大家对websocket的基本轮廓包括基础知识做了一定的了解学习,那么本篇文章将会从demo的角度去实现群聊和私聊的功能,一起来看看吧!

📃目录实现效果前台核心代码设置不同状态封装一个发送信息函数后台核心代码获取到token封装一个给前端返回消息的函数定义与前端一致的状态对象封装一个js文件处理token校验token前台实现(所有代码)node后台实现(所有代码)小结实现效果

这里有个小遗憾,我忘给私聊添加一个简单的样式了,这也是最后我突然发现了,xdm,你们在下面可以去添加一下私聊的简单dom,我这里就用控制台打印实现了!

前台核心代码设置不同状态【node进阶】深入浅出websocket即时通讯(二)-实现简易的群聊&私聊(node实战)

在这里设置了四种状态,每种状态对应着相应的功能,有获取群列表信息、转到群聊、转到私聊

const WebSocketType = { Error: 0, //错误 GroupList: 1,//群列表 GroupChat: 2,//群聊 SingleChat: 3//私聊 }封装一个发送信息函数

因为我们给后端发送信息时只能传字符串,所以我们将传给后端的这个对象转换成字符串的形式,使用内置方法JSON.stringify()

function createMessage(type, data, to) { return JSON.stringify({ type, data, to });}后台核心代码获取到token

使用js中的内置方法new URL()获取到请求地址的参数,注意,这里的req.url是请求地址后面的参数!

const myURL = new URL(req.url, "http://127.0.0.1:3000")const token = myURL.searchParams.get("token")封装一个给前端返回消息的函数

与前台的代码相似,给前台对应的状态返回信息!

function createMessage(type, user, data) { return JSON.stringify({ type: type, user: user, data: data });}定义与前端一致的状态对象

实现与前台对象相对应的状态!

const WebSocketType = { Error: 0, //错误 GroupList: 1, //群列表 GroupChat: 2, //群聊 SingleChat: 3 //私聊}封装一个js文件处理tokenconst jwt = require('jsonwebtoken')const secret = 'ccc-data'const JWT = {//jwt的sign()生成token generate(value,expires) { return jwt.sign(value,secret,{expiresIn:expires}) }, //解密token,验证 verify(token) { try { return jwt.verify(token,secret) } catch (error) { return false } }}module.exports = JWT校验token

这里校验token,成功后,就会给前台返回欢迎来到本聊天室的字样,并且给我们的句柄添加一个user属性,目的是让我们明确是谁进入到了聊天室,返回进入聊天室这个人的信息!

// 校验token const payload = JWT.verify(token) if (payload) { ws.send(createMessage(WebSocketType.GroupChat, null, '欢迎来到本聊天室')); ws.user = payload //群发 sendAll() } else { ws.send(createMessage(WebSocketType.Error, null, 'token过期')) }前台实现(所有代码)<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <link rel="stylesheet" href="./stylesheets/chat.css"></head><body> <h1 id="h1">欢迎来到聊天室</h1> <h3 id="h3"></h3> <input type="text" id="text"><button id="send">send</button> <select id="select"></select> <div id="chat"></div> <!-- 建立socket连接,带着token,后端验证 --> <script> h1.innerHTML = `${localStorage.getItem("username")}欢迎您来到聊天室` const WebSocketType = { Error: 0, //错误 GroupList: 1,//群列表 GroupChat: 2,//群聊 SingleChat: 3//私聊 } function createMessage(type, data, to) { return JSON.stringify({ type, data, to }); } const ws = new WebSocket(`ws://localhost:8080?token=${localStorage.getItem("token")}`) ws.onopen = () => { console.log('连接成功!'); } ws.onmessage = (msgObj) => { // console.log(msgObj.data); msgObj = JSON.parse(msgObj.data) switch (msgObj.type) { case WebSocketType.Error: localStorage.removeItem("token") location.href = '/login' break; case WebSocketType.GroupList: console.log(JSON.parse(msgObj.data)); const onlineList = JSON.parse(msgObj.data) h3.innerHTML = `` h3.innerHTML = `当前在线人数:${onlineList.length}` select.innerHTML = `` select.innerHTML = `<option value="all">All</option>` + onlineList.map(item => ` <option value="${item.username}">${item.username}</option> `).join('') break; case WebSocketType.GroupChat: console.log((msgObj.user ? msgObj.user.username : '广播') + ':' + msgObj.data); var para = document.createElement("p"); var node = document.createTextNode((msgObj.user ? msgObj.user.username : '广播') + ':' + msgObj.data); para.appendChild(node); chat.appendChild(para); break; case WebSocketType.SingleChat: console.log(msgObj.user.username + ':' + msgObj.data); break; } } send.onclick = () => { if (select.value === 'all') { // console.log('群发'); ws.send(createMessage(WebSocketType.GroupChat, text.value)) } else { // console.log('私聊'); ws.send(createMessage(WebSocketType.SingleChat, text.value, select.value)) } } </script></body></html>node后台实现(所有代码)//websocket响应const { json } = require('express');const WebSocket = require('ws');const JWT = require('../util/jwt');const WebSocketServer = WebSocket.WebSocketServerconst wss = new WebSocketServer({ port: 8080});wss.on('connection', function connection(ws, req) { const myURL = new URL(req.url, "http://127.0.0.1:3000") console.log(req.url); //获取到token,随后进行验证 const token = myURL.searchParams.get("token") // 校验token const payload = JWT.verify(token) console.log(payload); if (payload) { ws.send(createMessage(WebSocketType.GroupChat, null, '欢迎来到本聊天室')); ws.user = payload //群发 sendAll() } else { ws.send(createMessage(WebSocketType.Error, null, 'token过期')) } ws.on('message', function message(data) { console.log('received: %s', data); const msgObj = JSON.parse(data) //解析前台传来的数据 switch (msgObj.type) { //通过switch分支来进行不同状态的相应操作 case WebSocketType.GroupList: //获取进入聊天室的人员列表 ws.send(createMessage(WebSocketType.GroupList, null, JSON.stringify(Array.from(wss.clients).map(item => item.user)))) //由于返回的类型是set集合,所以我们通过Array.from()转化为真正的数组! break; case WebSocketType.GroupChat: //群聊分支 //转发给其他人 wss.clients.forEach(function each(client) { if (client.readyState === WebSocket.OPEN) { client.send(createMessage(WebSocketType.GroupChat, ws.user,msgObj.data),{binary : false}) } }); break; case WebSocketType.SingleChat: //私聊分支 wss.clients.forEach(function each(client) { // console.log(client.user); console.log(ws.user); if (client.user.username === msgObj.to && client.readyState === WebSocket.OPEN) { client.send(createMessage(WebSocketType.SingleChat, ws.user,msgObj.data),{binary : false}) } }); break; } }); ws.on('close', () => { wss.clients.delete(ws.user) sendAll() })});const WebSocketType = { Error: 0, //错误 GroupList: 1, //群列表 GroupChat: 2, //群聊 SingleChat: 3 //私聊}function createMessage(type, user, data) { return JSON.stringify({ type: type, user: user, data: data });}const sendAll = () => { //转发给其他人 wss.clients.forEach(function each(client) { if (client.readyState === WebSocket.OPEN) { client.send(createMessage(WebSocketType.GroupList, null, JSON.stringify(Array.from(wss.clients).map(item => item.user)))) } });}小结

这些代码看起来觉得好多好多呀,其实我们滤清思路分析一下,可以发现前后端是对应着的,按着对应关系一一去写代码就会非常轻松,这里的代码逻辑相对来说还是很清晰的,本篇文章到这里就结束了!下周开始不定时要进行js的重生之路了,将会结合许许多多的demo带领大家去学习js,不至于到头来啥也不会,少年,继续加油吧!

注意:登录功能的设置token,以及axios的拦截器将会在以后的node项目实战中与大家见面,我们之前学了jwt,相信大家会写一个登录的接口和简单页面!

👑书写不易,希望大家能够给予三连支持,期待我更好的文章哟👑

本文链接地址:https://www.jiuchutong.com/zhishi/297735.html 转载请保留说明!

上一篇:HTML侧边导航栏(html导航栏边框)

下一篇:重磅!openAI开放chatGPT模型APIgpt-3.5-turbo,成本直降90%!(openapi开放平台)

  • 苹果麦克风启用不成功怎么回事(苹果麦克风启用不成功请重新拨打)

    苹果麦克风启用不成功怎么回事(苹果麦克风启用不成功请重新拨打)

  • b站手机直播弹幕在哪里开(b站手机直播弹幕姬)

    b站手机直播弹幕在哪里开(b站手机直播弹幕姬)

  • 华为微信聊天记录怎么迁移到另一个手机(华为微信聊天记录删除了怎么恢复)

    华为微信聊天记录怎么迁移到另一个手机(华为微信聊天记录删除了怎么恢复)

  • 蓝牙耳机一个有电一个没电怎么充电(蓝牙耳机一个有杂音滋滋滋怎么办)

    蓝牙耳机一个有电一个没电怎么充电(蓝牙耳机一个有杂音滋滋滋怎么办)

  • 支付宝智能语音助手怎么用(支付宝智能语音提示未掌握此功能)

    支付宝智能语音助手怎么用(支付宝智能语音提示未掌握此功能)

  • 腾讯极速版和正常版有什么区别(腾讯极速版跟腾讯视频有什么区别)

    腾讯极速版和正常版有什么区别(腾讯极速版跟腾讯视频有什么区别)

  • oppopcat00是什么手机(oppoPCAT00是什么型号)

    oppopcat00是什么手机(oppoPCAT00是什么型号)

  • x发热严重怎么解决(冉冉发热怎么办)

    x发热严重怎么解决(冉冉发热怎么办)

  • vivo手机如何安装高危软件(vivo手机如何安装2个微信)

    vivo手机如何安装高危软件(vivo手机如何安装2个微信)

  • 微信字体是什么字体(微信字体是什么字号)

    微信字体是什么字体(微信字体是什么字号)

  • 内屏漏液怎么办(折叠手机内屏漏液怎么办)

    内屏漏液怎么办(折叠手机内屏漏液怎么办)

  • wifi不稳定跟路由器有关系吗(wifi联网不稳定)

    wifi不稳定跟路由器有关系吗(wifi联网不稳定)

  • 华为p30pro贴钢化膜有影响吗(华为p30pro贴钢化膜好还是软膜好)

    华为p30pro贴钢化膜有影响吗(华为p30pro贴钢化膜好还是软膜好)

  • bklaloo是什么手机(bkkaloo是什么型号)

    bklaloo是什么手机(bkkaloo是什么型号)

  • vivo手机上面出现个HD是怎么回事(Vivo手机上面出现上下)

    vivo手机上面出现个HD是怎么回事(Vivo手机上面出现上下)

  • wps文档怎么查找姓名(wps文档怎么查找错别字)

    wps文档怎么查找姓名(wps文档怎么查找错别字)

  • 手机怎么显示流量使用(手机怎么显示流量使用情况)

    手机怎么显示流量使用(手机怎么显示流量使用情况)

  • 拼多多如何发无需物流(拼多多怎么无限发图片)

    拼多多如何发无需物流(拼多多怎么无限发图片)

  • 华为荣耀8x有智能遥控吗(华为荣耀8x有智能语音唤醒吗)

    华为荣耀8x有智能遥控吗(华为荣耀8x有智能语音唤醒吗)

  • 苹果打电话突然没声音(苹果打电话突然挂断是怎么回事)

    苹果打电话突然没声音(苹果打电话突然挂断是怎么回事)

  • 图虫卡点视频怎么保存(图虫卡点下载)

    图虫卡点视频怎么保存(图虫卡点下载)

  • 小米充电宝高配版和普通版的区别(小米充电宝高配版和闪充版)

    小米充电宝高配版和普通版的区别(小米充电宝高配版和闪充版)

  • 苹果7p什么时候出的(苹果7P什么时候出产)

    苹果7p什么时候出的(苹果7P什么时候出产)

  • 如何设计手机app启动页(如何设计手机字体)

    如何设计手机app启动页(如何设计手机字体)

  • 电力系统的常用仿真模块MATLAB/SIMULINK(1)(电力系统常用的接线有哪几种)

    电力系统的常用仿真模块MATLAB/SIMULINK(1)(电力系统常用的接线有哪几种)

  • 详细vite创建vue3项目(vue3+vue-router+ts+vite+element-plus+pinia)(vue3.0创建)

    详细vite创建vue3项目(vue3+vue-router+ts+vite+element-plus+pinia)(vue3.0创建)

  • python顺序搜索的两种形式(python 顺序)

    python顺序搜索的两种形式(python 顺序)

  • 支付宝沙箱服务 (结合springboot实现,这里对接的是easy版本,工具用的是IDEA,WebStrom)(沙箱支付宝app正式版)

    支付宝沙箱服务 (结合springboot实现,这里对接的是easy版本,工具用的是IDEA,WebStrom)(沙箱支付宝app正式版)

  • 税控盘是干什么用的
  • 境外收入个人所得税抵免限额
  • 财政补助资金是什么意思
  • 材料采购暂估入账
  • 企业的培训费会计分录
  • 企业所得税申报表A类
  • 机票里面的其他税费抵扣吗
  • 营改增建筑安装服务发票要求
  • 季节性停用的设备应计提折旧吗
  • 房租抵扣个税需要提供发票吗
  • 资产损失税前扣除管理办法2019
  • 企业所得税季度申报时间
  • 商场交的房租押金可以退吗
  • 公司股权平价转让要交税吗
  • 全额拨款事业单位企业所得税
  • 个人劳务费发票可以委托其他人去开吗
  • 酒生产车间
  • 企业有哪些o
  • 理发店财务分析报告
  • 非公司车辆的使用费如何入账?
  • 租入办公设备的租金计入什么科目
  • 资产减值损失在贷方表示什么意思
  • 协定存款分析及2018金融机构人民币存款基准利率表
  • 分公司的款汇入总公司得出什么证明
  • 单位代缴纳职工个税如何账务处理
  • 企业合并的会计分录
  • 工会经费的计税依据包括单位社保吗
  • windows10出现你的电脑出现问题
  • 上月暂估成本高了这个月怎么做账
  • macOS Big Sur 11.1 开发者预览版 Beta 2推送更新
  • 最贵的十张照片
  • 生产型企业出口外购货物可以退税吗
  • 多洛米蒂徒步线路
  • IIS 7.5 asp Session超时时间设置方法
  • 参展费会计分录
  • css垂直导航栏
  • 大前端最新
  • vue中解决跨域问题
  • 民办非企业现金流量表的编制公式
  • 个人终止投资经营的条件
  • 要求供应商赔偿说明函范本
  • windows7基本使用教程
  • 股东分红方式如何约定
  • 长期股权投资为什么不是所有者权益
  • 体检费用需要缴哪些费用
  • 材料采购如何做好市场调研工作
  • 息税前利润变动率的计算公式
  • 小型数据库软件有哪些
  • 住宿发票遗失怎么办
  • 退回工伤保险的现金流
  • 应收账款的账期是什么意思
  • 已经认证抵扣的发票,要退回,怎么处理
  • 其他业务支出可以在企业所得税前扣除吗
  • 收到保险理赔款计入什么科目
  • 工程施工科目核算内容
  • 预付账款属于资产类科目
  • 跨期发票会计处理
  • 统计会计主要做什么
  • 费用预算表怎么做
  • 简述工作底稿的一般要求及内容
  • 隐藏在大山深处的罪恶
  • centos怎么设置
  • xp注册表损坏怎么修复
  • aow进程
  • vrvedp_m.exe是什么
  • windows日历
  • 微软win10专业版多少钱
  • javascript的代码写在哪里
  • node解析前端formdata数据
  • js的select()方法
  • android studio右边的视图不见了
  • javascriptwhile
  • python程序讲解
  • android view view
  • 国家税务局广东省电子税务总局手机版
  • 东城国税局局长
  • 云南国税局官网网站
  • 地税局热线电话是多少
  • 合规管理的基本要求
  • 福建地税网
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设