nodejs 使用 ws/socket.io 模块 websocket 即时通讯

源码 koa-mongodb-template

ws 模块

下载

npm install ws

简单使用

服务端代码

const WebSocket = require("ws");
const WebSocketServer = WebSocket.WebSocketServer;const wss = new WebSocketServer({ port: 8080 });// 监听客户端连接
wss.on("connection", function connection(ws) {// 客户端连接后,发送消息ws.send("hello socket");// 监听客户端发来的消息ws.on("message", function message(data) {console.log("data", data, data.toString());// 广播发送给全部客户端wss.clients.forEach(function each(client) {// 判断是否是自己,判断是否在线,发送给在线的客户端if (client !== ws && client.readyState === WebSocket.OPEN) {// 不使用二进制数据client.send(data, { binary: false });}});});
});

客户端代码

<body><h1>socket</h1><button class="btn">发送</button><script>const socket = new WebSocket("ws://localhost:8080")const btn = document.querySelector('.btn')btn.addEventListener('click', () => {socket.send("客户端发送了消息")})socket.onopen = () => {console.log('连接成功');}socket.onmessage = (msg) => {console.log('message', msg, msg?.data);}socket.onerror = () => {console.log('err');}</script>
</body>

apipost 连接测试
在这里插入图片描述

实现用户验证

在这里插入图片描述

const WebSocket = require("ws");const { checkToken } = require("../utils");const WebSocketServer = WebSocket.WebSocketServer;
const wss = new WebSocketServer({ port: 8080 });wss.on("connection", function connection(ws, req) {// 获取 token 参数const token = new URL(req.url, "http://localhost:3000").searchParams.get("token");// 获取用户信息const userInfo = checkToken(token);if (userInfo) {ws.send(`欢迎回来,${userInfo?.userName}`);// 向 ws 添加 userInfo 属性,值为 userInfo,可通过 wss.clients 查看ws.userInfo = userInfo} else {ws.send("未登录");}});

实现获取用户列表群聊私聊

WebSocket 有:message 事件 监听消息,send 方法 发送消息
如何使用这两个更方便的前后端交互,需要在发送消息做处理

定义 json 数据

  • type 类型 1:获取用户列表 2:群聊 3:私聊
  • data 返回的数据
{"type": 1,"data": null
}

socket.io

下载

npm install socket.io

使用

服务端代码片段

const { checkToken } = require("../utils");function main(app, port) {const { createServer } = require("http");const { Server } = require("socket.io");const httpServer = createServer(app.callback());const io = new Server(httpServer, {/* options */});// 连接io.on("connection", (socket) => {// 获取 tokenconst token = socket.handshake.query?.token;// 解析用户信息const userInfo = checkToken(token);if (userInfo) {// 向 socket 添加 userInfo 属性socket.userInfo = userInfo;// 自定义事件名 user,参数可直接传 json 格式socket.emit("user", { data: userInfo, msg: "获取信息成功" });} else {socket.emit("error", { data: null, msg: "token 错误" });}// 获取列表 data 前端传递的参数socket.on("list", (data) => {const list = Array.from(io.sockets.sockets).map((item) => item[1].userInfo);console.log("list", list);});// 获取私聊socket.on("single", (data) => {console.log("single", data);Array.from(io.sockets.sockets).forEach((item) => {if (item[1].userInfo?._id === data.id) {item[1].emit("single", {});}});});// 获取群聊socket.on("group", (data) => {console.log("group", data);// 给所有人发io.sockets.emit("group", {});// 发送除了自己,其他所有// socket.broadcast.emit("group", {});});socket.on("disconnect", (data) => {console.log("disconnect", data);});});httpServer.listen(port, () => {console.log(`http://127.0.0.1:${port}`);});
}function sendAll(io) {const list = Array.from(io.sockets.sockets).map((item) => item[1].userInfo);// 群发io.sockets.emit("list", { data: list });
}module.exports = main;

apipost 测试
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/232665.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】冯诺依曼体系结构与操作系统及其进程

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解冯诺依曼体系结构与操作系统&#xff0c;掌握…

我为什么从来不给患者方子?

有的患者问&#xff1a;“大夫我给您几百块钱处方费&#xff0c;拿您的方子自己去抓&#xff0c;行吗&#xff1f;” 我笑着回答&#xff1a;“不行的&#xff0c;跟钱没有关系&#xff0c;原因有以下四个。” 【1】 有的患者带方子走后&#xff0c;找抓药的人或者别的中医对…

用bash写脚本

本章主要介绍如何使用bash写脚本。 了解通配符 了解变量 了解返回值和数值运算 数值的对比 判断语句 循环语句 grep的用法是“grep 关键字 file”&#xff0c;意思是从file中过滤出含有关键字的行。 例如&#xff0c;grep root /var/log/messages&#xff0c;意思是从/var/log/…

【工作流Activiti】MyActivit的maven项目

1、Idea新建一个项目MyActivit的maven项目 2、安装插件 在 idea 里面&#xff0c;activiti 的插件叫 actiBPM&#xff0c;在插件库里面把它安装好&#xff0c;重启 idea 就行了。 3、 maven 项目中&#xff0c;并更改 pom.xml。pom 中依赖如下&#xff1a; <?xml version…

Postman使用总结-断言

让 Postman 工具 代替 人工 自动判断 预期结果 和 实际结果 是否一致 断言代码 书写在 Tests 标签页中。 查看断言结果 Test Results 标签页

安防视频云平台/可视化监控云平台EasyCVR获取设备录像失败,该如何解决?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。GB28181音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视…

鸿蒙-arkTs:基础组件

图片组件 - Image(src: string | PixelMap | Resource) string格式&#xff1a;加载远程地址图片&#xff08;需要配置ohos.permission.INTERNET&#xff09;PixelMap格式&#xff1a;加载像素图Resource格式&#xff1a;加载本地图片&#xff08;Image($r(app.media.icon))&a…

torch.optim.lr_scheduler.LambdaLR( )函数的用法

torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch-1) 是 PyTorch 中的学习率调度器类之一&#xff0c;用于根据自定义的函数 lr_lambda 调整优化器的学习率 用法: torch.optim.lr_scheduler.LambdaLR(optimizer,lr_lambda,last_epoch-1)参数说明&#xf…

linux中数据库的概念、mysql的两种安装方法

数据库 数据库数据库DBsql语言关系型数据库&#xff08;SQL&#xff09;非关系型数据库&#xff08;NOSQL&#xff09;关系型数据库与非关系型数据库的区别 Mysqlmysql定义版本演化 Mysql安装Mysql源码安装准备环境清理环境安装依赖包添加MySQL用户添加mysql组创建数据目录和其…

鸿蒙实现年月日十分选择框,支持年月日、月日、日、年月日时分、时分切换

import DateTimeUtils from ./DateTimeUtils;CustomDialog export default struct RQPickerDialog {controller: CustomDialogControllertitle: string 这是标题TAG: string RQPickerDialog// 0 - 日期类型&#xff08;年月日&#xff09; 1 - 时间类型&#xff08;时分&a…

Ubuntu安装ARM交叉编译器

Ubuntu安装交叉编译器 更新apt # 更新apt sudo apt update安装gcc sudo apt install build-essential查看gcc版本 gcc -v下载交叉编译工具 复制到用户目录 解压 tar -xvf gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf.tar.xz移动到/opt/下 sudo ./gcc-linaro-5.…

14、Kafka 请求是怎么被处理的

Kafka 请求是怎么被处理的 1、处理请求的 2 种常见方案1.1、顺序处理请求1.2、每个请求使用单独线程处理 2、Kafka 是如何处理请求的&#xff1f;3、控制类请求和数据类请求分离 无论是 Kafka 客户端还是 Broker 端&#xff0c;它们之间的交互都是通过 “请求 / 响应” 的方式完…

42 经典回溯算法题-全排列

问题描述&#xff1a;给你的那个一个不好喊重复数字的数组nums&#xff0c;返回其所有可能的全排列&#xff0c;你可以按照任何顺序返回答案&#xff1b; 回溯算法求解&#xff1a;定义一个used数组用来表征数组nums是否被选择&#xff0c;每一个回溯函数都要经过nums.length个…

Home Assistant HAOS版如何安装HACS

环境&#xff1a; Home Assistant 11.2 SSH & Web Terminal 17.0 问题描述&#xff1a; Home Assistant HAOS版如何安装HACS 解决方案&#xff1a; 1.打开WEB 里面的终端输入下面命令 wget -O - https://hacs.vip/get | bash -如果上面的命令执行后卡住不动&#xff…

深度学习模型(目标检测)轻量化压缩算法的挑战与解决方法

深度学习模型&#xff0c;尤其是用于目标检测的模型&#xff0c;是高度复杂的&#xff0c;通常包括数以百万计的参数和复杂的层次结构。虽然模型压缩和轻量化算法允许这些模型在资源受限的设备上部署和运行&#xff0c;但这仍然是一个活跃和具有挑战性的研究领域&#xff0c;包…

R语言生物群落(生态)数据统计分析与绘图丨R语言基础、tidyverse数据清洗、多元统计分析、随机森林模型、回归及混合效应模型、结构方程模型、统计结果作图

R 语言的开源、自由、免费等特点使其广泛应用于生物群落数据统计分析。生物群落数据多样而复杂&#xff0c;涉及众多统计分析方法。本教程以生物群落数据分析中的最常用的统计方法回归和混合效应模型、多元统计分析技术及结构方程等数量分析方法为主线&#xff0c;通过多个来自…

js 字符串之间转换

一. 字符串转换 &#xff08;1&#xff09;对象转字符串stringify var str JSON.stringify(weather);&#xff08;2&#xff09;字符串转对象 var obj JSON.parse(str);&#xff08;3&#xff09;数字转字符串toString() var num 2023; var str ; str num.toString();…

记一次jar冲突的问题

问题 业务中需要在spark中链接redis作为服务缓存&#xff0c;spark程序中引入redis的jar包后上传spark集群运行是报java.lang.NoSuchMethodError: com.xxx.common.pool.ConnectionPool.startAsync()Lcom/google/common/util/concurrent/Service;根据报错信息发现是jar包冲突造…

【Java】工业园区高精准UWB定位系统源码

UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术&#xff0c;它不采用正弦载波&#xff0c;而是利用纳秒级的非正弦波窄脉冲传输数据&#xff0c;因此其所占的频谱范围很宽。UWB定位系统依托在移动通信&#xff0c;雷达&#xff0c;微波电路&#xff0c;云计算与大数据…

SQL Server 查询处理过程

查询处理--由 SQL Server 中的关系引擎执行&#xff0c;它获取编写的 T-SQL 语句并将其转换为可以向存储引擎发出请求并检索所需结果的过程。 SQL Server 需要四个步骤来处理查询&#xff1a;分析、代化、优化和执行。 前三个步骤都由关系引擎执行&#xff1b;第三步输出的是…