使用 Node.js 和 Socket.io 构建可创建、可加入房间的实时聊天室

学习知识点

通过可以加入房间的聊天室应用程序,首先可以回顾 Socket.io 的基本使用方法和流程,并在此基础上我们学习jointo两个 API 方法,从而实现简易的可加入房间的聊天系统。

需要的插件

Socket.ioexpressejs

梳理应用步骤

在实现应用程序之前,我们先梳理一下我们需要的功能和流程。

所需功能:

  • 1、用户可以自己创建聊天房间或者加入聊天房间
  • 2、消息的发送只能在对应的房间内发送
  • 3、当用户关闭页面后,其他人会收到用户下线的通知

系统开发流程:

  • 1、搭建 socketio 服务
  • 2、创建服务端与客户端成对的消息交互事件
  • 3、创建服务端与客户端用户上线和下线交互事件

实现步骤

1、使用ejs编写房间页面

房间页面主要包含两个功能:

  • 1、展示已创建的房间
  • 2、创建房间

具体代码如下:

html 复制代码
<!-- 房间列表 -->
<div id="room_box">
  <% Object.keys(rooms).forEach(room=> { %>
  <div><%= room %></div>
  <a href="/<%= room %>">加入房间</a>
  <%}) %>
</div>

<!-- 创建房间表单 -->
<form action="/room" method="post">
  <input name="room" type="text" required />
  <button type="submit">创建新房间</button>
</form>

2、使用express创建对应的请求路由和业务处理

js 复制代码
app.get("/:room", (req, res) => {
  if (rooms[req.params.room] === null) {
    res, redirect("/");
  }

  res.render("room", { roomName: req.params.room });
});

app.post("/room", (req, res) => {
  // 判断房间是否已经存在
  if (rooms[req.body.room]) {
    return res.redirect("/");
  }

  rooms[req.body.room] = { users: {} };
  res.redirect(req.body.room);

  io.emit("room-create", req.body.room);
});

3、客户端创建监听新建房间的消息

客户端创建监听新建房间的消息,从而可以实时的展示房间列表,具体代码如下:

javascript 复制代码
socket.on("room-create", (room) => {
  const _divEL = document.createElement("div");
  _divEL.innerText = room;

  const _aEl = document.createElement("a");
  _aEl.innerText = `您已加入房间`;
  _aEl.href = `/${room}`;

  roomBox.append(_divEL);
  roomBox.append(_aEl);
});

4、客户端发送创建用户消息到 socketio 服务并加入对应的房间

当用户创建好房间后,页面会跳转到具体的聊天房间页面,进入房间页面后我们需要让页面发送对象的 socketio 消息,这样才能加入具体的房间。具体代码如下:

javascript 复制代码
// 客户端
socket.emit("new-user", roomName, useName);

// 服务端
socket.on("new-user", (room, name) => {
  rooms[room].users[socket.id] = name;
  socket.join(room);
  socket.to(room).emit("user-connected", name);
});

5、实现服务端和客户端消息发送的 socketio 功能

这里的功能可以参考使用 Node.js 和 Socket.io 构建实时聊天应用程序的代码。

只是我们再发送消息的时候要使用 socketio 的to方法来加入对应的房间后在发送消息。具体代码判断如下:

javascript 复制代码
socket.to(room).emit("chat-message", {
  message: message,
  name: rooms[room].users[socket.id],
});

完整代码

完整代码示例下载

相关推荐
宸翰8 小时前
解决uni-app 中 SVG 图片在 iOS 端显示模糊问题
前端·uni-app
数据掘金8 小时前
第三方 SDK 集体故障时,你的 App 会怎样?可落地的监控与降级方案
前端
AI分享猿8 小时前
UI设计Prompt系列(十七):团队如何管理UI Prompt——减少产品、设计与开发之间的信息损耗
前端·prompt
资讯综合8 小时前
2026全国云渲染网站排名 不同需求用户适配榜单
开发语言·前端·javascript
PHP实战开发录9 小时前
PHP接口超时后为什么任务还在跑
开发语言·前端·php·开发
脉动数据行情19 小时前
Node.js WebSocket 实现贵金属实时行情监听 伦敦金 / 伦敦银自动重连方案
websocket·node.js·vim
今天AI了吗9 小时前
2026年三大AI桌面智能体横评:Codex vs Hermes vs WorkBuddy
大数据·前端·css·人工智能·架构
kill5229 小时前
interface vs type:到底该用哪个
前端
敲代码的嘎仔9 小时前
从零实现视频续播 + 学习进度统计:前端心跳、条件更新、GROUP BY 统计全链路拆解
java·前端·数据库·学习·面试·职场和发展·音视频
不老刘9 小时前
一行命令解决 Node.js 版本兼容问题:`--openssl-legacy-provider` 深度解析
node.js