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

news2024/9/20 17:01:40

源码 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) => {
		// 获取 token
		const 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.coloradmin.cn/o/1322141.html

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

相关文章

Python Pandas 通过loc/iloc修改局部数据(第9讲)

Python Pandas 通过loc/iloc修改局部数据(第9讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ…

一款视频行为分析系统,可轻松开发安全行为检测

系列版本介绍 基于视频行为分析系统v4系列版本可以在不用考虑流媒体音视频开发&#xff0c;编解码开发&#xff0c;界面开发等情况下&#xff0c; 只需要训练自己的模型&#xff0c;开发自己的行为算法插件&#xff0c;就可以轻松开发出任何你想要的安全行为检测&#xff0c;比…

【MYSQL】--MySQL的安装以及基础

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

【Python秘技】用Python实现千图成像,千字成像,编程炫技必备!

一个千图成像&#xff0c;千字成像的程序&#xff0c;开源给大家玩玩。 用她的名字组成她的照片会不会很酷呢&#xff1f; 后续会完善更多功能&#xff0c;打包为程序。 源代码在这里&#xff1a;https://github.com/w-x-x-w/Thousand-Image-Generator 讲解在这里&#xff…

建筑模板怎么选?

在建筑领域&#xff0c;选择合适的模板材料对于确保工程质量、提高施工效率和控制成本至关重要。目前&#xff0c;常见的建筑模板主要有钢模板、塑料模板和木模板三种类型&#xff0c;每种都有其独特的优势和局限性。本文将对这些模板类型进行分析&#xff0c;并特别推荐广西生…

生物化学 荒诞医学史笔记:重金属(暂记)

“理论基础” 四液说 根据希罗多德的说法&#xff0c;古埃及人为了维持自身健康&#xff0c;每月都会使用催吐剂。希波克拉底也提倡定期呕吐。之后的好几千年中&#xff0c;这种建议不断出现。直到最近几十年&#xff0c;催吐剂还被认为是医学处方的重要组 成部分。 大…

这个食堂管理大招,再不知道就晚了!

随着社会的不断发展&#xff0c;餐饮行业也在不断创新和进步。在这个数字化时代&#xff0c;智能技术为各行各业提供了更高效、便捷的解决方案。 食堂作为人们日常生活中不可或缺的一部分&#xff0c;也迎来了智能化的时代。智慧收银系统不仅提高了食堂的运营效率&#xff0c;还…

论文Rebuttal常见格式与模板之中篇

论文Rebuttal常见格式与模板之中篇 前言5. Rebuttal可能遇到的问题5.4 实验不充分5.5 语法&#xff0c;结构&#xff0c;参考文献遗漏等问题5.6 非热点问题&#xff0c;研究意义&#xff1f; 6. 针对AC Message下篇笔记链接Rebuttal模板的好文 前言 这里承接上一篇笔记&#x…

WEB渗透—PHP反序列化(五)

Web渗透—PHP反序列化 课程学习分享&#xff08;课程非本人制作&#xff0c;仅提供学习分享&#xff09; 靶场下载地址&#xff1a;GitHub - mcc0624/php_ser_Class: php反序列化靶场课程&#xff0c;基于课程制作的靶场 课程地址&#xff1a;PHP反序列化漏洞学习_哔哩…

原知因,正成为中产群体“精准抗衰”新选择

惧怕衰老&#xff0c;渴望长寿&#xff0c;是全人类的共同属性。而在现代生命科学的加持下&#xff0c;科学家们的勇气也前所未有的可畏&#xff0c;人类长寿基因发现者Nir Barzilai就是其中最具代表性的一位。作为人类史上首个抗衰老临床研究TAME的负责人&#xff0c;这位大佬…

初学gitrepo的种种

经过各种折腾之后&#xff0c;发现git其实还是很简单的&#xff1b; 首先你需要两台机器&#xff0c;一台作为服务器&#xff0c;一台作为开发机器&#xff0c;开发机器从服务器上拉取代码。 目 目录 git建仓 开发机器拉取代码 初始化仓代码 repo管理 repo工具的下载 …

Apollo开放平台9.0让自动驾驶开发者轻松上手

文章目录 平台架构&#xff1a;基础环境&#xff1a;开始使用&#xff1a;体验心得: 在自动驾驶技术飞速发展的今天&#xff0c;成为这个领域的一名开发者是一次挑战、一次冒险&#xff0c;更是一次心灵之旅。作为这个领域的先锋之一&#xff0c;Apollo开放平台9.0于12月19日发…

关于PBR策略路由的基础实验

策略路由是基于策略实现数据流量转发&#xff0c;不基于路由表。 // 网络结构实现 lsw: 配置三层交换机 vlan batch 10 20 30 int g0/0/2 port link-type access port default vlan 10 int g0/0/3 port link-type access port default vlan 20 int g0/0/1 port link-type acce…

【Linux基础】4. 目录管理

文章目录 【 1. 处理目录的常用命令 】【 2. ls列出目录 】【 3. cp切换目录 】【 4. pwd显示目前所在的目录 】【 5. mkdir创建新目录 】【 6. rmdir删除空的目录 】【 7. cp复制文件或目录】【 8. rm移除文件或目录 】【 9. mv移动文件与目录或修改名称 】 Linux 的目录结构为…

关于“Python”的核心知识点整理大全28

目录 11.1.5 添加新测试 11.2 测试类 11.2.1 各种断言方法 unittestModule中的断言方法&#xff1a; ​编辑11.2.2 一个要测试的类 survey.py language_survey.py 11.2.3 测试 AnonymousSurvey 类 test_survey.py 往期快速传送门&#x1f446;&#xff08;在文章最后&…

【Java】【Hutool】从零开始实现发送邮件功能

采用Hutool工具实现发送邮件&#xff0c;可以访问Hutool官网 引言&#xff1a;从零开始&#xff0c;实现一个基本功能&#xff0c;邮件发送 第一步&#xff1a;打开idea&#xff0c;新建maven工程&#xff0c;引入依赖&#xff0c;如下&#xff1a; <dependencies><…

电力智能运维管理系统

电力智能运维管理系统是一种基于先进的信息技术、自动化技术和智能控制技术&#xff0c;针对电力行业的特殊需求而开发的一种全面综合性管理系统。 依托电易云-智慧电力物联网&#xff0c;该系统以实时监测、高效运维、远程控制的方式&#xff0c;将各类数据信息及时采集、处理…

【Maven-Helper】利用 Maven-Helper 解决依赖冲突问题

【Maven-Helper】利用 Maven-Helper 解决依赖冲突问题 1&#xff09;安装 Maven-Helper 插件2&#xff09;Maven Helper 插件使用方法3&#xff09;Idea-Maven 可视化依赖树 1&#xff09;安装 Maven-Helper 插件 这里我们已经安装过了&#xff0c;如果没有安装过&#xff0c;点…

银行测试:第三方支付平台业务流,功能/性能/安全测试方法

1、第三方支付平台的功能和结构特点 在信用方面&#xff0c;第三方支付平台作为中介&#xff0c;在网上交易的商家和消费者之间作一个信用的中转&#xff0c;通过改造支付流程来约束双方的行为&#xff0c;从而在一定程度上缓解彼此对双方信用的猜疑&#xff0c;增加对网上购物…

【Mac】flutter项目集成高德定位SDK,获取key

一、获取调试版安全码SHA1 1.进入当前用户文件夹下的~/.android目录 cd ~/.android2.查看 debug.keystore ls3.运行 debug.keystore keytool -list -v -keystore debug.keystore这里报错&#xff1a; The operation couldn’t be completed. Unable to locate a Java Runt…