NodeJs 实战-构建有多个房间的聊天室

nodejs多房间web聊天室 一年之前的做的小项目,过了许久,翻出当时的PPT文档总结一下。源码下载:https://github.com/CreekLou/chatRoom Nodejs背景简介 1 ,JavaScript最早是运行在浏览器中,然而浏览器只是提供了一个上下文 2 ,node.js事实上就是另外一种上下文,它允许在后端(脱离浏览器环境)运行JavaScript代码 3 ,Node.js事实上既是一个 阅读详情

版本信息

C:\Users\Administrator>node -v
v18.12.1

C:\Users\Administrator>npm -v
8.19.3

聊天室页面展示

首页

在这里插入图片描述

修改昵称

输入 /nick chengdu
在这里插入图片描述

切换房间

点击右侧房间列表切换
在这里插入图片描述

基础知识文档

nodejs web

使用node 启动一个 web服务

const http = require('http')

const hostname = '127.0.0.1'
const port = 3000

const server = http.createServer((req, res) => {
	res.statusCode = 200
	res.setHeader('Content-Type', 'text/plain')
	res.end('Hello World\n')
})

server.listen(port, hostname, () => {
	console.log(`Server running at http://${hostname}:${port}/`)
})

socket 文档地址

https://socket.io/

主要代码

server.js

var http = require('http');
var fs = require('fs');
var path = require('path');
var mime = require('mime');
var cache = {};

const hostname = '127.0.0.1';
const port = 3000;

/**
 * 请求不存在时,发送404错误
 * @param {*} response 
 */
function send404(response) {
    response.writeHead(404, {'Content-Type': 'text/plain'});
    response.write('Error 404: resource not found.');
    response.end();
}

/**
 * 发送文件
 * @param {*} response 
 * @param {*} filePath 
 * @param {*} fileContents 
 */
function sendFile(response, filePath, fileContents) {
    response.writeHead(200, 
        {"Content-type": mime.lookup(path.basename(filePath))}
    );
    response.end(fileContents);
}

/**
 * 静态资源查找
 * @param {*} response 
 * @param {*} cache 
 * @param {*} absPath 
 */
function serverStatic(response, cache, absPath) {
    if (cache[absPath]) {
        sendFile(response, absPath, cache[absPath]);
    } else {
        if (fs.existsSync(absPath)) {
            fs.readFile(absPath, function(err, data) {
                if (err) {
                    send404(response);
                } else {
                    cache[absPath] = data;
                    sendFile(response, absPath, data);
                }
            });
        } else {
            send404(response);
        }
    }
}

var server = http.createServer(function(request, response) {
    var filePath = false;
    if (request.url == '/') {
        filePath = 'public/index.html';
    } else {
        filePath = 'public' + request.url;
    }
    var absPath = './' + filePath;
    serverStatic(response, cache, absPath);
});

server.listen(port, hostname, () => {
	console.log(`Server running at http://${hostname}:${port}/`)
});

var chatServer = require('./lib/chat_server');//加载自定义模块
chatServer.listen(server);

chat_server.js

var socketio = require('socket.io');
var io;
var guestNumber = 1;
var nickNames = {};
var namesUsed = [];
var currentRoom = {};
var roomNames = new Set();

exports.listen = function(server) {
    io = socketio.listen(server);
    // 设置日志输出级别 0-error 1-warn 2-info 3-debug, 默认为3
    io.set('log level', 2);
    io.sockets.on('connection', function(socket) {
        guestNumber = assignGuestName(socket, guestNumber);

        roomNames.add('Lobby');
        joinRoom(socket, 'Lobby');  //用户连接上时把他放入聊天室Lobby

        //处理用户的消息, 更名以及聊天室的创建与变更
        handleMessageBroadcasting(socket);
        handleNameChangeAttempts(socket);
        handleRoomJoining(socket);

        //用户发出请求时, 展示所有聊天室列表
        socket.on('roomlist', function () {
            socket.emit('roomlist', {text: Array.from(roomNames)});
        });

        //定义用户断开连接后的清除逻辑
        handleClientDisconnection(socket);

    });
}

function assignGuestName(socket, guestNumber) {
    var name = 'Guest' + guestNumber;
    nickNames[socket.id] = name;
    socket.emit('nameResult', {
        success: true,
        name: name
    });
    namesUsed.push(name);
    return guestNumber + 1;
}

function joinRoom(socket, room) {
    socket.join(room);
    currentRoom[socket.id] = room;
    socket.emit('joinResult', {room: room});
    socket.broadcast.to(room).emit('message', {
        text: nickNames[socket.id] + ' has joined ' + room + ' - '
    });
    var usersInRoom = io.sockets.clients(room);
    if (usersInRoom.length > 1) {
        var usersInRoomSummary = 'Users currently in ' + room + ': ';
        for (var index in usersInRoom) {
            var usersSocketId = usersInRoom[index].id;
            if (usersSocketId != socket.id) {
                if (index > 0) {
                    usersInRoomSummary += ', ';
                }
                usersInRoomSummary += nickNames[usersSocketId];
            }
        }
        usersInRoomSummary += '.';
        socket.emit('message', {text: usersInRoomSummary});
    }
}

function handleNameChangeAttempts(socket) {
    socket.on('nameAttempt', function(name) {
        if (name.indexOf('Guest') == 0) {
            socket.emit('nameResult', {
                success: false,
                message: 'Names cannot begin with "Guest".'
            });
        } else {
            if (namesUsed.indexOf(name) == -1) {
                var previousName = nickNames[socket.id];
                var previousNameIndex = namesUsed.indexOf(previousName);
                namesUsed.push(name);
                nickNames[socket.id] = name;
                delete namesUsed[previousNameIndex];
                socket.emit('nameResult', {
                    success: true,
                    name: name
                });
                socket.broadcast.to(currentRoom[socket.id]).emit('message', {
                    text: previousName + ' is now known as ' + name + ' . '
                });
            } else {
                socket.emit('nameResult', {
                    success: false,
                    message: 'That name is already in use. '
                });
            }
        }
    });
}

function handleMessageBroadcasting(socket) {
    socket.on('message', function(message) {
        socket.broadcast.to(message.room).emit('message', {
            text: nickNames[socket.id] + ': ' + message.text
        });
    });
}

function handleRoomJoining(socket) {
    socket.on('join', function(room) {
        socket.leave(currentRoom[socket.id]);
        roomNames.add(room.newRoom);
        joinRoom(socket, room.newRoom);
    });
}


function handleClientDisconnection(socket) {
    socket.on('disconnect', function() {
        var nameIndex = namesUsed.indexOf(nickNames[socket.id]);
        delete namesUsed[nameIndex];
        delete nickNames[socket.id];
    });
}

源码地址

https://gitee.com/3281328128/chat-room.git

下载之后,执行以下命令启动

npm install
node server.js
Node.js搭建多房间聊天室的完整指南 Express是一个最小且灵活的Node.js Web应用框架,它提供了一系列强大的特性来开发Web和移动应用。它具有以下优势:高性能:Express使用了Node.js自身的HTTP处理能力,因此它能高效地处理大量并发请求。灵活性:Express不会对应用程序施加任何规则,开发者可以自由选择需要的特性来构建应用。中间件支持:提供了一个强大的中间件系统,可以轻松地添加处理请求和响应的中间件。丰富的功能:包括路由、模板引擎支持、静态文件服务等。 阅读详情

相关推荐

chat:本项目运用了 nodejs(express4.0) + mysql + websocket 实现的qq群聊 私聊,客服聊天,从注册到登录聊天比较全,下载后启动方式分两种.1.进入bin文件夹,pm2 start chat 2.node

node-js-getting-started 使用准系统Node.js应用程序。 此应用程序支持“文-签出。 本地运行 确保已安装和 。 $ git clone https://github.com/sunyuelei/chat.git $ cd chatnew $ npm install $ cd bin $ pm2 start chat 您的应用现在应该可以在[https://内网ip(例如:192.168.1.45)]上运行。 ## Mysql配置 Mysql的账号密码为root:root 数据库命令 创建数据库网络聊天; 创建表用户( username varchar(20) not null primary key, password varchar(20) not null, nickname varchar(50) not null, email varch

使用nodejs搭建聊天室

搭建一个服务器 //引入fs var fs = require('fs') //引入http var http = require('http') var date = new Date() /** * @FormDate 格式化时间 * @param {*} date 当前时间 */ function FormDate(date) { return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()} ${date

HAI6545的博客 2458

基于Node.js的实时在线聊天室设计源码

本项目是基于Node.js开发的实时在线聊天室设计源码,包含61个文件,其中包括24个JavaScript文件,8个Vue组件文件,6个JPG图片,5个XML文件,4个Map文件,2个HTML页面,2个CSS样式文件,2个PNG图片,以及1个Babel配置文件和1个Editor配置文件。该聊天室支持聊天室、私聊和弹幕功能,为用户提供了一个高效、实时的在线交流平台。

使用nodejs+Socket打造P2P实现多人聊天室

使用nodejs+Socket打造P2P实现多人聊天室

零小唬的博客 2775

基于AMD AU15P FPGA的SLVS-EC桥PCIe设计方案分享

各位FPGAer周末愉快,今天熊猫君分享一个基于AMD AU15P FPGA的SLVS-EC桥PCIe设计方案。

haoxingheng的专栏 1447

【芯片验证随心记】1.SystemVerilog中,rand和randc的区别?如何用constraint实现randc?

在SystemVerilog里,randc 的“不重复循环”特性是用一个 周期性排列器(permutation engine) 实现的,而这个引擎在 LRM 里并没有公开。我们只能在 “用户空间” 用 rand + constraint 去模仿它的行为。每次随机化只取 queue.pop_front(),用完再洗。在4次随机化内,y会依次出现0,1,2,3各一次(顺序随机)每次随机化,x可能是0-3中的任意值,可能连续多次相同。每次随机化时,在未使用的值里随机挑一个;第5次随机化时,重新生成新的排列周期。

qq_43172512的博客 342

推荐项目:Node.js 实现的多房间聊天应用

推荐项目:Node.js 实现的多房间聊天应用 项目简介 该项目是一个基于 Node.js 和 Socket.IO 的实时多房间聊天应用,提供了一个简单而有效的平台,让用户能够在一个或多个自定义的“房间”中进行实时交流。项目源码位于 ,开发者可以通过查看代码和克隆仓库来进一步了解和使用。 技术栈分析 Node.js:这是一个开放源代码、跨平台的 JavaScript 运行环境,用于服务器端编程...

gitblog_00012的博客 358

达梦数据库(DM)的备份与恢复功能

本文系统介绍了达梦数据库(DM)的备份与恢复功能,主要包括作业系统和物理/逻辑备份还原两大模块。作业系统部分详细说明了通过代理环境创建定时备份和删除备份作业的步骤;物理备份还原部分阐述了联机和脱机备份方式,包括数据库、表空间、表和归档的备份还原操作;逻辑备份还原部分介绍了dexp/dimp工具的使用方法及四种级别的导入导出功能。文章还介绍了图形化管理工具进行备份还原的操作流程,全面覆盖了达梦数据库的数据保护方案,为数据库管理员提供了详细的技术指导。

weixin_48812832的博客 1211

【nodejs实打造多人实时聊天室】

【nodejs实现多人实时聊天】

阿牛哥的博客 1661

Android 集成 Google 与 Facebook 第三方登录实战详解(2024版)

本文详细介绍了2024年Android应用集成Google与Facebook第三方登录的完整实战指南。通过分步教程和代码示例,帮助开发者快速实现一键登录功能,提升用户体验和注册转化率,同时涵盖隐私合规和常见错误处理的最佳实践。

blue的专栏 822

从零开始:如何在Windows上搭建Airsim仿真环境(避坑指南)

本文是一份详细的Windows平台AirSim仿真环境搭建指南。文章从硬件要求、Visual Studio与虚幻引擎安装开始,逐步讲解AirSim插件编译、UE项目配置,并重点介绍了通过WSL2连接PX4飞控软件实现软件在环仿真的完整流程。内容涵盖常见问题排查与性能优化,旨在帮助开发者避开常见陷阱,高效构建可用于无人机算法开发的虚拟测试平台。

earth的博客 307

Nodejs+webSocket搭建多人聊天室

NodeJs+webSocket搭建多人聊天室准备的东西:第一步:安装插件并且完善服务端第二步 :搭建客户端并与服务端的通信第三步 :添加CSS样式第四步:总结 今天花了一个上午的时间去学习了一下使用nodejs+websocket搭建多人聊天室。下面我分享下我做这个多人聊天室案例的整个过程。 先看下最终的效果图 上图的功能包括:显示在线人数,在同一房间可以互相发送消息,显示在线用户的列表. 下...

小贱贱的博客 7452

LS-DYNA超高速碰撞仿真入门:从SPH算法配置到铝靶板穿孔分析(附K文件模板)

本文详细介绍了使用LS-DYNA中的SPH(光滑粒子流体动力学)算法进行超高速碰撞仿真的完整流程。以铝弹丸撞击铝靶板为例,从SPH算法原理、LS-PrePost前处理、材料模型与状态方程设置,到接触定义、边界条件及K文件生成,提供了系统的入门指导和关键参数调试经验,帮助工程师高效模拟材料破碎、穿孔等极端变形问题。

h0i1j2k3l的博客 735

node.js 聊天室 android,Nodejs实现多房间简易聊天室功能

1、前端界面代码前端不是重点,够用就行,下面是前端界面,具体代码可到github下载。2、服务器端搭建本服务器需要提供两个功能:http服务和websocket服务,由于node的事件驱动机制,可将两种服务搭建在同一个端口下。1、包描述文件:package.json,这里用到了两个依赖项,mime:确定静态文件mime类型,socket.io:搭建websocket服务,然后使用npm insta...

weixin_39882589的博客 270

基于深度学习的X光安检危险品检测系统(YOLOv8 + UI界面 + 数据集)

随着全球安全形势的变化,机场、车站、地铁等场所的安检工作日益重要。X光安检系统已经成为现代公共安全领域中不可或缺的部分,能够有效地检测物品的内部结构,识别潜在的危险品。然而,传统的X光图像分析方法仍然依赖人工操作,检测效率较低,并且易受到人为因素的影响。近年来,深度学习技术的应用在图像分析领域取得了显著的突破,特别是在目标检测任务中,YOLO(You Only Look Once)模型因其高效性和精度,成为了许多目标检测任务的首选模型。

YOLO 1061

MTK AWB 色温曲线的进一步猜想

平均距离来判断是否对该色温下白平衡进行全部收白处理,还是保留一些光源的本身的颜色。比如占据图像一大半左右的纯色背景,纵坐标值相对横坐标的距离应该会比较大,大于一般场景下的正常白点分布。反之,位于Plank_curve下方位置的点具有偏洋红色的倾向。此时拟合各个色温下的白点,拟合曲线大致是以X= 0.85)平行于横轴的一条直线。对原始坐标系中的点取对数后的Log坐标系空间。此时拟合各个色温下的白点,拟合曲线大致呈现的是一条直线。,可以认为是各种色温下白点分布所呈现的走向。的算法利用某个色温点的偏离。

大熊 722

基于NodeJs的在线聊天室

基于NodeJs的在线聊天室一、技术选型: 前端需要的后端相关技能 NodeJs(express框架)、MongoDb(NoSql的使用学习) 前端需要的前后端通讯知识 实时通讯使用WebSocket(比如Socket.IO) 前端需要的框架 可以选型angularjs、react,如果需要移动端,可以考虑react native,当然也可以响应式开发 二、功能总结 基础功能访问网站主页,一个

程序员小周的博客 5214

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

nodejs构建多房间简易聊天室

1、前端界面代码   前端不是重点,够用就行,下面是前端界面,具体代码可到github下载。 2、服务器端搭建   本服务器需要提供两个功能:http服务和websocket服务,由于node的事件驱动机制,可将两种服务搭建在同一个端口下。   1、包描述文件:package.json,这里用到了两个依赖项,mime:确定静态文件mime类型,socket.io:搭建w...

weixin_30493321的博客 470

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

node+socket.io 实现一个聊天室

我们只做简单的实现,不接入数据库,nodejs也不使用express和koa等框架 因此依赖只有两个: 1、socket.io 2、mime(用于获取静态资源时获取文件的mime类型)   安装命令: npm install socket.io mime --save 其他的就不赘述了   先描述一下文件目录结构 静态 js 和 css 文件放在 public 下面的相应目...

SailorCai的技术博客 1248

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

开发基于NodeJS的秘室聊天室

借着放假期间将NodeJS重新回顾了一下并玩了一下sketch来进行设计界面,很不错。(注:代码整理后会放到github上,请关注。) 本次聊天室我给它定义了一个名称叫“秘密聊天室”。 需求: 技术选型: 后端:NodeJs,Socket.io,中间件(express,body-parser,multer,ejs),mongoose          express:是NodeJs

three_bird的博客 1402

web聊天室

最近这两天在看node.js,看大家好多人都拿聊天室这个项目来练习node,我也来凑个热闹。整个项目是基于node.js ,webSocket的实现实时通信,管理多个房间,统计房间内用户,切换不同房间等功能。看着nodejs实战这本书,但书中代码老旧,读懂书中代码后,去官网查最新文档,对比着修改代码,最后将功能重新实现。既屡了逻辑,也了解了最新文档,收获蛮多的。目录结构 代码: server.j

zhouxin_182的博客 652

nodejs websocket 实现简易聊天室功能

文章目录1. 服务端 app.js 代码2. 客户端 app.html 代码3. 样式代码 app.css4. nodemon 辅助开发 首先说明,以下代码都是基于Nodejs+webSocket搭建多人聊天室实现,我只是复现了一遍,画了张图供自己理解。 数据格式及大致过程简图: 1. 服务端 app.js 代码 const ws = require('nodejs-websocket') const broadcast = (str) => { server.connections.fo

越来越棒鸭 942

php如何实现房间,Nodejs实现多房间简易聊天室功能_node.js_自学php网

1、前端界面代码前端不是重点,够用就行,下面是前端界面,具体代码可到github下载。2、服务器端搭建本服务器需要提供两个功能:http服务和websocket服务,由于node的事件驱动机制,可将两种服务搭建在同一个端口下。1、包描述文件:package.json,这里用到了两个依赖项,mime:确定静态文件mime类型,socket.io:搭建websocket服务,然后使用npm insta...

weixin_39914732的博客 237

基于 nodejs 的 webSockt (socket.io)

基于 nodejs 的 webSockt (socket.io) 理解 本文的业务基础是在基于 nodejs 的 socket.io 的直播间聊天室(IM)应用来的。 项目中具体的 框架如下 express + mongodb + socket.io 在介绍 socket.io 之前,我们有必要对 webSocket 进行根本的原理的理解。 一、webSocket 的前生今世 1、...

ankuailan3925的博客 617

基于NodeJS的秘室聊天室

借着放假期间将NodeJS重新回顾了一下并玩了一下sketch来进行设计界面,很不错。(注:代码整理后会放到github上,请关注。) 本次聊天室我给它定义了一个名称叫“秘密聊天室”。 需求: 技术选型: 后端:NodeJs,Socket.io,中间件(express,body-parser,multer,ejs),mongoose express:是NodeJs ...

weixin_30341735的博客 133
上一篇: npm 常用命令
下一篇: NodeJs实战-待办列表(1)-读取提交表单页面
Chengdu.S
博客等级 码龄9年 284粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chengdu.S

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值