从零开始用react + tailwindcss + express + mongodb实现一个聊天程序(十一) 实现服务端和客户端socketio 连接

1.后端部分

socketIO文档参考Socket.IO

首先在lib下新建socket.js文件

参考服务器API | Socket.IO

import {Server} from 'socket.io';
import http from 'http'
import express from "express"

const app = express()
const server = http.createServer(app)
const io = new Server(server, {
    cors: {
        origin: "http://localhost:5173",
    }
})
// 获取信息接收人的socketId
export function getReceiverSocketId(userId) {
    return userSocketMap[userId]
}
// 当前连接的用户socketMap 统计在线用户
const userSocketMap = {};  // {userId:socketId}
// 监听用户连接
io.on("connection", (socket) => {
    console.log("用户连接",socket.id)
    // 用户连接时传过来的userId
    const userId = socket.handshake.query.userId
    // 如果userId存在,则添加到userSocketMap
    if(userId) userSocketMap[userId] = socket.id

    // 当前在线用户广播
    io.emit("getOnlineUsers", Object.keys(userSocketMap))

    socket.on("disconnect", () => {
        console.log("用户失去连接",socket.id)
        // 从userSocketMap中移除
        delete userSocketMap[userId]
        // 当前在线用户广播
        io.emit("getOnlineUsers", Object.keys(userSocketMap))
    })
})
export {io, app, server}

这时修改下index.js 的引入

 import {app,server} from './lib/socket.js'

2.前端部分

useAuthStore.js 引入io

import {io} from "socket.io-client"

新增2个state属性   onlineUsers: [], // 在线用户     socket:null   //socket 当前用户连接实例

常量定义 const BASE_URL = "http://localhost:3000"

我们创建2个方法

connectSocket: () => {

        const {authUser} = get()

        // 如果已经登录,并且socket已经连接,则不重新连接

        if(!authUser || get().socket?.connected) return

        const socket = io(BASE_URL, {

            // 指定query参数 把自己userId传给socket

            query: {

                userId: authUser._id

            }

        })

        socket.connect()

        // 设置socket实例 如不设置 disconnectSocket失效

        set({socket})

        // 监听服务端推送过来的在线用户列表

        socket.on("getOnlineUsers", (userIds) => {

            set({onlineUsers: userIds})

        })

    },

 disconnectSocket: () => {

        if(get().socket?.connected) {

            get().socket.disconnect()

        }

    }

在login方法中 我们登录成功后 要调用connectSocket方法

 

在logout方法中加入 

 get().disconnectSocket()

3.测试 

前端用户登录成功后  后端打印xx用户已连接

用户退出登录时 后端打印 用户失去连接

 

下篇 继续 socketio处理消息的转发 广播 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot使用JDBC /JPA访问达梦数据库

Spring Boot 是一个广泛使用的 Java 框架,用于快速构建基于 Spring 的应用程序。对于达梦数据库(DMDB)的支持,Spring Boot 本身并没有直接内置对达梦数据库的集成,但你可以通过一些配置和依赖来支持达梦数据库。 以下…

蓝桥杯嵌入式学习日记(三)——按键的长按、短按与双击(三行按键法)【STM32】【HAL库】

目录 一、查阅相关资料二、程序的编写1、创建工程2、三行按键法3、短按与长按4、双击 一、查阅相关资料 想要进行一块板子的开发,需要先查阅资料了解器件连接。   从CT117E-M4产品手册中不难发现,按键分别有PB0、PB1、PB2、PA0分别对应B1、B2、B3、B4…

【网络安全 | 漏洞挖掘】通过JWT的IDOR实现账户接管

未经许可,不得转载。 文章目录 正文正文 在审查目标平台“redirect.com”的Web应用时,我发现它使用了JSON Web Token(JWT)进行身份验证,因此决定尝试进行账户接管(ATO)攻击。 首先,我创建了一个新账户并测试了其功能。在此过程中,我尝试在“firstName”字段输入XSS(…

从0到1入门RabbitMQ

一、同步调用 优势:时效性强,等待到结果后才返回 缺点: 拓展性差性能下降级联失败问题 二、异步调用 优势: 耦合度低,拓展性强异步调用,无需等待,性能好故障隔离,下游服务故障不影响…

CST直角反射器 --- 距离多普勒(RD图), 毫米波汽车雷达ADAS

之前几期介绍了雷达是如何从频域换去时域,然后时域计算距离。 这期我们加上一个维度,既看距离,又看速度。速度的计算当然就是多普勒原理,所以距离速度的二维图又叫range-doppler图。 启用雷达ADAS Range-Doppler模板&#xff1a…

手写一个Tomcat

Tomcat 是一个广泛使用的开源 Java Servlet 容器,用于运行 Java Web 应用程序。虽然 Tomcat 本身功能强大且复杂,但通过手写一个简易版的 Tomcat,我们可以更好地理解其核心工作原理。本文将带你一步步实现一个简易版的 Tomcat,并深…

【从零开始学习计算机科学】计算机组成原理(六)异常事件处理

【从零开始学习计算机科学】计算机组成原理(六)异常事件处理 异常事件处理异常处理的数据通路异常事件入口地址 异常事件处理 异常和中断事件改变处理机正常指令的执行顺序。异常指令执行过程中,由于操作非法和指令非法引起的事件。陷阱指陷…

3.3.2 Proteus第一个仿真图

文章目录 文章介绍0 效果图1 新建“点灯”项目2 添加元器件3 元器件布局接线4 补充 文章介绍 本文介绍:使用Proteus仿真软件画第一个仿真图 0 效果图 1 新建“点灯”项目 修改项目名称和路径,之后一直点“下一步”直到完成 2 添加元器件 点击元…

高效运行 QwQ-32B + 错误修复

文章目录 QwQ-32B 错误修复⚙️ 官方推荐设置👍 推荐的 llama.cpp 设置📖 教程:运行和修复的 QwQ-32B1、对于 llama.cpp 及使用 llama.cpp 的引擎:2、下载模型 测试3、测试/评估4、尝试不使用我们的修复方案: &#x…

R 语言科研绘图 --- 直方图-汇总

在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…

1.5.1 掌握Scala内建控制结构 - 条件表达式

本文介绍了 Scala 中条件表达式的使用及其在实际任务中的应用。条件表达式的语法为 if (条件) 值1 else 值2,其结果类型取决于值1和值2的类型。如果类型相同,结果类型与它们相同;如果不同,则结果类型为 Any。通过两个任务展示了条…

Linux rootfs:如何开机就自动添加某个用户?

前言 项目开发需求,需要开机后就自动创建某个用户密码 厂家提供的sdk,只有adduser命令, 该命令添加用户时,会有终端交互, 需要手动输入2次密码, 所以无法通过简单脚本方式创建。 要实现自动填充密码&…

计算机三级网络技术知识点汇总【7】

第七章 路由器配置及使用 1. 路由器的基础知识 1.1 路由器的基本概念 路由器是工作在网络层的设备,负责将数据分组从源端主机经最佳路径传送到目的端主机,实现在网络层的互联。路由器工作在 TCP/IP 网络模型的网络层,对应于 OSI 网络参考模…

Compounding Geometric Operations for Knowledge Graph Completion(论文笔记)

CCF等级:A 发布时间:2023年7月 25年3月10日交 一、简介 使用知识图谱嵌入模型,将三元组(h,r,t)中关系 r 转化为平移、旋转、缩放矩阵对头节点以及尾节点进行运算,判定三元组的真实性。 二、原理 1.整…

mac系统安装

目录 准备工作 一、安装虚拟机 二、解锁系统 三、安装系统 四、部署系统 五、安装VMware Tools(选做) 为什么要安装VMware Tools,这是啥玩意? 六、配置共享文件夹(选做) 为什么要共享文件夹? 注意事项: 七、安装完成 准备工作 一、安装说明: 本教程分为7个部…

DNASimCLR:一种基于对比学习的基因序列数据分类的深度学习方法

摘要 DNASimCLR利用卷积神经网络和基于对比学习的SimCLR框架,从不同的微生物基因序列中提取复杂的特征。在包含宏基因组和病毒基因序列的两个经典的大规模未标记数据集上进行了预训练。后续的分类任务通过使用先前获得的模型对预训练的模型进行微调来完成。我们的实…

Ae 效果详解:VR 旋转球面

Ae菜单:效果/沉浸式视频/VR 旋转球面 Immersive Video/VR Rotate Sphere VR 旋转球面 VR Rotate Sphere效果用于对 VR 视频进行三轴旋转,以调整视频的视角方向。可用于校正拍摄时的角度偏差,或者根据创意需求模拟摄像机旋转。 本效果适用于所…

南开提出1Prompt1Story,无需训练,可通过单个连接提示实现一致的文本到图像生成。

(1Prompt1Story)是一种无训练的文本到图像生成方法,通过整合多个提示为一个长句子,并结合奇异值重加权(SVR)和身份保持交叉注意力(IPCA)技术,解决了生成图像中身份不一致…

Python----数据可视化(Seaborn二:绘图一)

常见方法 barplot方法 单独绘制条形图 catplot方法 可以条形图、散点图、盒图、小提亲图、等 countplot方法 统计数量 一、柱状图 seaborn.barplot(dataNone, xNone, yNone, hueNone, colorNone, paletteNone) 函数描述data用于绘图的数据集。x用于绘制长格式数据的输入。…

只音 1.2.0 |纯净无广告,畅听全网音乐,支持无损下载和批量下载

只音是一款全网音乐一网打尽的听歌利器,无需登录即可搜索抖音、网易云、QQ音乐等平台资源,无损音质直连播放。内置智能推荐算法,每日更新热门榜单与个性化歌单,轻松发现小众优质音乐。支持批量下载功能,一次性打包30首…