当前位置: 首页 > news >正文

采用nodejs + socket.io实现简易聊天室功能(群聊 + 私聊)

项目演示

支持群聊以及私聊
在这里插入图片描述

项目代码

index.html

<!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><script src="/socket.io/socket.io.js"></script><style>.box {display: flex;justify-content: space-between;width: 800px;margin: 50px auto;text-align: center;}.box>div {flex: 1;}.box .center {flex: 2;}.box .center input {width: 70%;}.list {list-style: none;text-align: left;}</style>
</head><body><div class="box"><div class="left"><div class="num">在线人数:1</div></div><div class="center"><h1 style="margin-bottom: 20px;">简易聊天室</h1><!-- 输入框 --><input type="text" class="ipt"><!-- 发送 --><button class="btn">发送消息</button><!-- 输入框 --><input type="text" class="joinNum"><!-- 加入房间 --><button class="joinBtn">加入房间</button><ul class="list" style="margin-top: 40px;"><!-- <li class="list-group-item">An item</li> --></ul></div><div class="right"><!-- <div>xxx已进入</div> --></div></div><script>let num = document.querySelector('.num')let ipt = document.querySelector('.ipt')let btn = document.querySelector('.btn')let joinNum = document.querySelector('.joinNum')let joinBtn = document.querySelector('.joinBtn')let list = document.querySelector('.list')let left = document.querySelector('.left')let center = document.querySelector('.center')let right = document.querySelector('.right')let socket = io()const name = prompt('请输入你的名称:')//把用户名称传递给服务端socket.emit('join', name)// 监听用户已进入 | 已退出socket.on('join', (obj) => {right.innerHTML += `<div>${obj.name} ${obj.status}</div>`})// 监听用户在线人数socket.on('userNum', (n) => {num.innerHTML = `在线人数:${n} 个人`})// 点击发送按钮 发送消息btn.addEventListener('click', function () {// 将数据传递给服务端socket.emit('value', ipt.value)})// 键盘按下回车 发送消息ipt.addEventListener('keydown', function (e) {if (e.key !== 'Enter') return// 将数据传递给服务端socket.emit('value', ipt.value)})// 加入房间joinBtn.addEventListener('click', function () {socket.emit("joinRoom", { room: joinNum.value, value: ipt.value })})// 服务端再把数据响应回来socket.on('value', (value) => {list.innerHTML += `<li>${value}</li>`ipt.value = ''})</script>
</body></html>

index.js

const app = require("express")();
const http = require("http").Server(app);
const io = require("socket.io")(http);app.get("/", (req, res) => {res.sendFile(__dirname + "/index.html");
});let userNum = 0; //当前在线人数io.on("connection", (socket) => {// 访问聊天室用户在线输了加1++userNum;// 将用户在线数量实时同步给客户端io.emit("userNum", userNum);// 相应客户端传递的数据socket.on("value", (value) => {io.emit("value", `${socket.username}${value}`);});// 监听用户进入聊天室socket.on("join", (name) => {socket.username = name;io.emit("join", {name: name,status: "已进入",});});// 离开聊天室用户在线数量减1socket.on("disconnect", () => {--userNum;io.emit("userNum", userNum);io.emit("join", {name: socket.username,status: "已退出",});});// 加入房间socket.on("joinRoom", ({ room, value }) => {// 加入指定的房间socket.join(room);// 在指定房间中发送消息io.to(room).emit("value", `${socket.username}${value}`);});
});http.listen(1231, () => {console.log("服务器已启动:http://localhost:1231");
});

package.json

{"name": "WebSocket","version": "1.0.0","main": "index.js","scripts": {"start": "node index.js"},"license": "MIT","dependencies": {"express": "^4.18.2","socket.io": "^4.5.4"}
}

通过 npm run start 运行项目

相关文章:

采用nodejs + socket.io实现简易聊天室功能(群聊 + 私聊)

项目演示 支持群聊以及私聊 项目代码 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport…...

消息队列(一):需求分析

为什么要做这样一个项目&#xff1f; 首先&#xff0c;我们在之前学习的时候&#xff0c;就认识了一下 生产者消费者模式&#xff0c;这样一个模式有两大好处&#xff1a; 解耦合 本来有个分布式系统&#xff0c;A服务器 调⽤ B服务器&#xff08;A给B发请求&#xff0c;B给A…...

ImageViewer技术实现细节

第1章 ImageViewer工具使用方法 1.1. 图像加载 1.1.1. 单图像加载 左上角菜单,“File”->“单图像”,或者Ctrl-S,弹出文件对话框,选择图像文件,当前支持bmp,png,jpg格式。 结果如下图所示: 1.1.2. 多图像加载 左上角菜单,“File”->“多图像”,或者Ctrl-M…...

MFC多文档程序,从菜单关闭一个文档和直接点击右上角的x效果不同

MFC多文档程序&#xff0c;从菜单关闭一个文档和直接点击右上角的x效果不同 若文档内容有修改&#xff0c;则前者会询问用户&#xff0c;是否保存修改&#xff1b;后者不保存修改直接关闭。 原因在于&#xff0c;从菜单关闭时&#xff0c;调用OnClose&#xff0c;一定会调用Sa…...

【数据结构】C++实现AVL平衡树

文章目录 1.AVL树的概念2.AVL树的实现AVL树结点的定义AVL树的插入AVL树的旋转左单旋右单旋左右双旋右左双旋插入代码 AVL树的验证AVL树的查找AVL树的修改AVL树的删除AVL树的性能 AVL树的代码测试 1.AVL树的概念 二叉搜索树虽然可以提高我们查找数据的效率&#xff0c;但如果插…...

图神经网络系列之序章

文章目录 一、为什么需要图神经网络&#xff1f;二、图的定义1.图的定义和种类2.一些关于图的重要概念2.1 子图2.2 连通图2.3 顶点的度、入度和出度2.4 边的权和网2.5 稠密图、稀疏图 3.图的存储结构3.1 邻接矩阵3.2 邻接表3.3 边集数组3.4 邻接多重表3.5 十字链表3.6 链式前向…...

Unity中 UI Shader的基本功能

文章目录 前言一、实现思路1、暴露一个 2D 类型的属性来接受UI的纹理2、设置shader的层级为TransParent半透明渲染层级&#xff0c;一般UI都是在这个渲染层级3、更改混合模式&#xff0c;是 UI 使用的纹理&#xff0c;该透明的地方透明 二、代码实现 前言 Unity中 UI Shader的…...

【自学开发之旅】Flask-标准化返回-连接数据库-分表-orm-migrate-增删改查(三)

业务逻辑不能用http状态码判断&#xff0c;应该有自己的逻辑判断。想要前端需要判断&#xff08;好多if…else&#xff09;&#xff0c;所以需要标准化&#xff0c;标准化返回。 json标准化返回: 最外面&#xff1a;data,message,code三个字段。 data&#xff1a;返回的数据 co…...

numpy增删改查

NumPy是一个用于科学计算的Python库&#xff0c;它提供了一个多维数组对象以及许多用于操作这些数组的函数。下面是关于如何在NumPy中进行增删改查操作的一些基本示例&#xff1a; 创建NumPy数组&#xff1a; import numpy as np # 创建一个一维数组 arr np.array([1, 2, 3, …...

【kafka】kafka重要的集群参数配置

如何规划Kafka 对于实际应用的生产环境中&#xff0c;需要尽量先规划设计好集群&#xff0c;避免后期业务上线后费力调整。在考量部署方案时需要通盘考虑&#xff0c;不能仅从单个维度上进行评估&#xff0c;下面是几个重要的维度的考量和建议&#xff1a; 这里重点说说操作系…...

cs224w_colab3_2023 And cs224w_colab4_2023学习笔记

class GNNStack(torch.nn.Module):def __init__(self, input_dim, hidden_dim, output_dim, args, embFalse):super(GNNStack, self).__init__() #这里的继承表示参见 https://blog.csdn.net/wanzew/article/details/106993425 # 继承时运行继承类别的函数 总之 __mro__的目的…...

Cannot find module ‘prop-types‘

把这个import删了。...

LeetCode-63-不同路径Ⅱ-动态规划

题目描述&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格中有障碍物。那…...

unity 使用Photon进行网络同步

Pun使用教程 第一步&#xff1a;请确保使用的 Unity 版本等于或高于 2017.4&#xff08;不建议使用测试版&#xff09;创建一个新项目。 第二步&#xff1a;打开资源商店并找到 PUN 2 资源并下载/安装它。 导入所有资源后&#xff0c;让 Unity 重新编译。 第三步&#xf…...

大数据课程M1——ELK的概述

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 了解ELK的定义&#xff1b; ⚪ 掌握ELK的使用&#xff1b; 一、什么是ELK 1. 简介 ELK 是elastic公司提供的一套完整的日志收集以及展示的解决方案&#xff0c;是三个…...

C# byte[] 如何转换成byte*

目标:将byte[]转成byte*以方便使用memcpy [DllImport("kernel32.dll", EntryPoint "RtlCopyMemory", CharSet CharSet.Ansi)] public extern static long CopyMemory(IntPtr dest, IntPtr source, int size); private void butTemp_Click(object…...

MySQL与Oracle的分页

MySQL与Oracle的分页 当我们通过SQL去查询一个结果集的时候&#xff0c;并不需要查看所有行&#xff0c;可能只是查看前几行&#xff0c;或者中间的几行。则需要像MySQL的limit或Oracle的ROWNUM与FETCH NEXT来实现。 MySQL 语法 SELECT * FROM table_name LIMIT [offset,] ro…...

git基本手册

Git and GitHub for Beginners Tutorial - YouTube Kevin Stratvert git config --global user.name “xxx” git config --global user.email xxxxx.com 设置默认分支 git config --global init.default branch main git config -h查看帮助 详细帮助 git help config 清除 cl…...

每日一题(两数相加)

每日一题&#xff08;两数相加&#xff09; 2. 两数相加 - 力扣&#xff08;LeetCode&#xff09; 思路 思路&#xff1a; 由于链表从头开始向后存储的是低权值位的数据&#xff0c;所以只需要两个指针p1和p2&#xff0c;分别从链表的头节点开始遍历。同时创建一个新的指针new…...

恒运资本:沪指震荡涨0.28%,医药板块强势拉升,金融等板块上扬

15日早盘&#xff0c;沪指盘中震荡上扬&#xff0c;科创50指数表现强势&#xff1b;北向资金小幅净流入。 到午间收盘&#xff0c;沪指涨0.28%报3135.31点&#xff0c;深成指、创业板指涨均0.11%&#xff0c;科创50指数涨1.04%&#xff1b;两市合计成交4357亿元&#xff0c;北…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...