1、几十行代码实现一个聊天室

简介: 1、前言Socket.io将数据传输部分独立出来形成engine.io,engine.io对WebSocket和AJAX轮询进行了封装,形成了一套API,屏蔽了细节差异和兼容性问题,实现了跨浏览器/跨设备进行双向数据通信。WebSocket是一种**双向通信协议,**WebSocket与HTTP协议一样都是基于TCP的

1、前言

Socket.io将数据传输部分独立出来形成engine.io,engine.io对WebSocket和AJAX轮询进行了封装,形成了一套API,屏蔽了细节差异和兼容性问题,实现了跨浏览器/跨设备进行双向数据通信。 WebSocket是一种**双向通信协议,**WebSocket与HTTP协议一样都是基于TCP的

2、功能与效果

  • 登陆、登出
  • 多用户聊天
  • 一对一聊天
  • 效果如下

3、目录结构

 

4、Node端服务

socket.io 服务需要依赖http服务,通过安装express,起一个http服务,然后安装socket.io

javascript

复制代码

npm i socket.io express -S

通过访问localhost:3000 访问页面

// app.js
const app = require("express")();
const server = require("http").Server(app);
const io = require("socket.io")(server);
app.get("/", function (req, res, next) {
  res.sendFile(__dirname + "/index.html");
});
server.listen("3000", function () {
  console.log("服务启动在3000");
});

服务端用到的socket.io的api

const io = require("socket.io")(server);
// 连接socket.io
io.on("connect", (socket) => {
    // socket.emit 代表着向客户端发送消息,客户端通过 socket.on("receive", params); 接收
    socket.emit("receive",params);
    // socket.on('send') 代表着接收客户端发来的消息, 客户端通过 socket.emit("send", params); 发送
    socket.on("send",params);
    // io.emit("all") 代表广播,给每个客户端发消息
    io.emit("all",params)
}) 

5、客户端socket的使用

客户端主要是使用socket.io的 emit 发送消息和on接收消息,和服务端的api相同 index.html

// 客户端需要引入包
<script src="/socket.io/socket.io.js"></script>
<script>
    // 使用
    let socket = io("http://localhost:3000");
    // 1、等待服务端的消息通知
    socket.on("notify", (username) => {
      message(`${username}加入进来了!`, 1);
    });
     // 2、发送消息给服务端
    function send() {
      if (!info.value) message("请输入消息", 0);
      socket.emit("message", people);
    }
</script>

6、用户登陆和列表展示流程

  • 客户端登陆通过sock.emit 将账号名称发给服务端
  • 服务端通过socket.emit 发送给客户端登陆成功,  通过 io.emit 广播给所有客户端
  • 服务端保存用户信息到user中,广播给客户端
  • 客户端通过拿到的数据展示

7、一对一对话功能实现

服务端 通过io.to(socketId).to(socketId).emit('my message') 发送给客户端 socketId是每个客户端登陆后都会生成的独一无二的标识, to就是向哪个人发送 服务端代码

服务端代码

  // 发送消息给某人
  socket.on("say to someone", (myId, userId, msg) => {
    let { sockedId, username } = users.find((el) => el.sockedId === myId);
    io.to(myId).to(userId).emit("my message", username, msg);
  });

客户端代码

  // 4、点击enter发送消息给单个的人
  function clickEnter(e) {
    let myId = socket.id;
    let userId = event.path[0].getAttribute("sockedId");
    let msg = event.path[0].value;
    var evt = window.event || e;
    if (evt.keyCode == 13) {
      event.path[0].value = "";
      socket.emit("say to someone", myId, userId, msg);
    }
  }
// 5、接收消息 展示出来
  socket.on("my message", (username, msg) => {
    let date = new Date().toLocaleString();
    message(`${username}: ${msg}---------${date}`, 3);
  });

8、完整代码

1、客户端

                                                         Title           #btn,     #info {       display: none;     }          

简易聊天室

     当前用户列表      

    账号:        登陆     退出登陆    

           发送                  ```

    2、服务端

    const app = require("express")();
    const server = require("http").Server(app);
    const io = require("socket.io")(server);
    server.listen("8080", function () {
      console.log("服务启动在3000");
    });
    app.get("/", function (req, res, next) {
      res.sendFile(__dirname + "/index.html");
    });
    let users = []; // 记录当前所有用户信息
    // 连接
    io.on("connect", (socket) => {
      // 登陆处理
      socket.on("login", (username, id) => {
        users.push({
          username: username,
          sockedId: id,
        });
        socket.username = username;
        // 推送登陆成功
        socket.emit("loginSuccess");
        //广播事件 io.emi 加入通知
        io.emit("notify", username);
        io.emit("updateUserList", users);
      });
      // 退出连接
      const disconnect = () => {
        if (socket.username) io.emit("loginOut", socket.username);
        users = users.filter((item) => item.username !== socket.username);
        socket.username = "";
        io.emit("updateUserList", users, socket.username);
      };
      //监听用户断开连接  和用户主动退出
      socket.on("disconnect", disconnect);
      socket.on("loginOut", disconnect);
      // 消息处理
      socket.on("message", (people) => {
        let { username, message } = people;
        io.emit("recevied", username, message);
      });
      // 断开连接
      socket.on("error", (reason) => {
        console.log(reason + "发生错误");
      });
      // 发送消息给某人
      socket.on("say to someone", (myId, userId, msg) => {
        let { sockedId, username } = users.find((el) => el.sockedId === myId);
        io.to(myId).to(userId).emit("my message", username, msg);
      });
    });
    

    9、参考

    文档:socket.io/docs/v3/ind…
    websocket+nodejs实现聊天室: juejin.cn/post/684490…

    github地址: github.com/s2265681/ro…

    相关文章
    |
    前端开发 Ubuntu 小程序
    ubuntu18.04常用软件安装(替代windows)
    ubuntu18.04常用软件安装(替代windows)
    1468 1
    ubuntu18.04常用软件安装(替代windows)
    |
    iOS开发 MacOS
    推荐几个mac分屏显示的工具
    桌面分屏是我们工作中经常会用到的功能,但是Mac上自带的分屏功能非常有限,必须进入全屏才能使用,管理窗口时使用起来并不方便。本文中我们就来推荐几款好用的Mac分屏软件,让你的窗口管理更简单
    |
    10月前
    |
    传感器 数据采集 算法
    STM32的SPI双机通信实现
    STM32的SPI双机通信实现
    1091 0
    |
    9月前
    |
    人工智能 监控 安全
    2025年国内主流数据治理与数据中台产品大全,国内数据治理厂商推荐
    在数字化转型加速的背景下,数据治理与数据中台成为企业释放数据价值的关键。本文聚焦国内市场,精选10款代表性产品——包括瓴羊Dataphin、腾讯WeData、华为DataArts Studio、字节Dataleap、网易数帆EasyData、奇点云DataSimba、袋鼠云DTinsight、亚信AISWare DataOS、星环TDS和数澜Datahub,从核心能力、架构特点与适用场景等维度进行解析。这些产品各具优势,文章建议企业结合自身规模、业务特性与技术基础,选择匹配的数据平台,以实现数据驱动的高质量发展。
    2025年国内主流数据治理与数据中台产品大全,国内数据治理厂商推荐
    |
    人工智能 自然语言处理 Linux
    如何获取 OpenAI API 密钥
    本教程详细介绍如何注册 OpenAI 账户、获取 API 密钥并部署 GPT-4 模型。内容涵盖访问官网、登录注册、创建密钥、配置 Python 环境及调用 API 的完整流程,并提供示例代码帮助开发者快速上手。
    |
    弹性计算 Kubernetes Perl
    k8s 设置pod 的cpu 和内存
    在 Kubernetes (k8s) 中,设置 Pod 的 CPU 和内存资源限制和请求是非常重要的,因为这有助于确保集群资源的合理分配和有效利用。你可以通过定义 Pod 的 `resources` 字段来设置这些限制。 以下是一个示例 YAML 文件,展示了如何为一个 Pod 设置 CPU 和内存资源请求(requests)和限制(limits): ```yaml apiVersion: v1 kind: Pod metadata: name: example-pod spec: containers: - name: example-container image:
    2068 3
    |
    前端开发 JavaScript 大数据
    React与Web Workers:开启前端多线程时代的钥匙——深入探索计算密集型任务的优化策略与最佳实践
    【8月更文挑战第31天】随着Web应用复杂性的提升,单线程JavaScript已难以胜任高计算量任务。Web Workers通过多线程编程解决了这一问题,使耗时任务独立运行而不阻塞主线程。结合React的组件化与虚拟DOM优势,可将大数据处理等任务交由Web Workers完成,确保UI流畅。最佳实践包括定义清晰接口、加强错误处理及合理评估任务特性。这一结合不仅提升了用户体验,更为前端开发带来多线程时代的全新可能。
    610 1
    |
    Java 测试技术 Maven
    Maven简介和安装(配置中央仓库和本地仓库,IDEA配置Maven)
    Maven简介和安装(配置中央仓库和本地仓库,IDEA配置Maven)
    Maven简介和安装(配置中央仓库和本地仓库,IDEA配置Maven)
    |
    JavaScript 前端开发
    JavaScript简易五子棋游戏
    JavaScript简易五子棋游戏
    392 0
    |
    网络协议 关系型数据库 MySQL
    从0到1教你在AWS中部署动态网站Typecho系统
    Typecho 是使用 PHP 语言开发的一套博客程序,同时也支持多种数据库(Mysql, PostgreSQL, SQLite),本篇文章将演示部署Typecho到aws上的过程。
    606 0
    从0到1教你在AWS中部署动态网站Typecho系统