Vue + Nodejs + socket.io 实现聊天

Vue 代码

javascript 复制代码
// 安装  socket.io-client

npm i socket.io-client



import io from 'socket.io-client';



    mounted () {
      // * location.origin 表示你的 socket 服务地址
      // * /XXXX/socket.io 表示 你的 socket 在服务器配置的 访问地址
      let socket = io(location.origin, {
        path: "/XXXX/socket.io"
      });
      this.soccket = socket;
      // 将 socket 挂载到全局
      this.$store.commit('setSocketMain', socket);

      // * 監聽 socket 鏈接成功
      socket.on('connect', () => {
        // userInfo 表示用户信息
        socket.emit('user:login', userInfo); // 发送一个自定义事件,如'user:login',以及用户信息  
      });
      
      // * 监听收到消息
      socket.on('message', message => {
        console.log('接收到信息', message);
        let  text = `${message.name}:${message.text}`;
      
        this.$notify({
          title: '消息提醒',
          dangerouslyUseHTMLString: true,
          message:text,
          type: "success",
          duration: 2000
        });
        // * 将消息显示在页面上
        this.pushMessage(message.text};
      })
    },
    methed:{
        // * 发送消息, 包含了 text,uid,toUid,fId,name
        pushMessage(arg){
            this.soccket.emit('message',arg)
        }
    }

NodeJS 代码

javascript 复制代码
// * 先安装 socket.io

npm i socket.io

// * 修改启动文件, 比如我的是 www.js
const express = require('express');
const http = require('http'); // 引入 http 模块
const socketIo = require('socket.io'); // 引入 socket.io 模块
// 实例化一个 express的对象
const app = express();
// 创建一个 HTTP 服务器实例
const server = http.createServer(app);
// 实例化 Socket.IO 并将其附加到 HTTP 服务器实例
const io = socketIo(server, {
  path: '/XXXX/socket.io', // 假设你的命名空间是 '/XXXX' , 这里也对应了 vue 那里的值
});

//监听3000端口
server.listen(3000, function () {
  var host = server.address().address;
  var port = server.address().port;
  if (host == '::') {
    host = 'localhost:';
  }
  console.log(`启动成功访问地址 http://${host}${port}`);
});

//暴露
module.exports = { app, io };

// * 其中,  app 会 被 app.js 所引用, 作为启动

// * io 可以在需要socket 的地方引用, 如 message.js

const { io } = require('../../bin/www');

// * socket 方法
const _socket = {
  // * socket - user 對象
  sockets: [],
  // * 用戶登錄
  login(socket, user) {
    this.sockets.push({
      uId: user.id,
      socketId: socket.id,
      socket: socket,
    });
  },
  // * 登出
  logout(socketId) {
    console.log('用戶離線');
    let u = this.sockets.filter((item) => item.socketId == socketId);
    if (u.length > 0) this.sockets.splice(this.sockets.indexOf(u[0]), 1);
  },
  // * 獲取當前用戶 的 socket
  getSocket(e) {
    console.log('獲取當前用戶:', e);
    let u = this.sockets.filter((item) => item.socketId == e || item.uId == e);
    if (u.length > 0) return u[0];
    return {};
  },
  // * 發送消息
  pushMessage(e, message) {
    let user = this.getSocket(e);
    let socket = user.socket;
    if (socket) {
      socket.emit('message', message);
    } else {
      console.log(`用戶離線或用戶不存在`);
    }
  },
};

// * 设置 Socket.IO 事件监听器
io.on('connection', (socket) => {
  let socketId = socket.id;
  // * 監聽用戶登錄
  socket.on('user:login', (user) => {
    console.log('有用戶上線了', user);
    _socket.login(socket, user);
  });
  // * 登出
  socket.on('user:logout', () => {
    socket.leave(socketId);
    _socket.logout(socketId);
  });
  // * 当客户端断开连接时
  socket.on('disconnect', () => {
    socket.leave(socketId);
    _socket.logout(socketId);
  });
  // * 监听接收消息
  socket.on('message',(arg)=>{
    const { fId,uid,name,toUid,text } = arg;
    // * 发送给指定人
    _socket.pushMessage(toUid, {
        fId: fId,
        uid: uid,
        toUid: toUid,
        name: decodeURI(name),
        text: text,
    });
  })
});
相关推荐
国科安芯7 小时前
航天电子模拟前端三大支柱:精密运放、高速运放与电压监控的协同设计方法——ASL8522S/ASL622S/ASL706S技术解析
前端·单片机·嵌入式硬件·fpga开发·架构·安全性测试
牧濑红莉7 小时前
网络安全竞赛pwn全解及第一道ai的wp
javascript·.net
神明不懂浪漫7 小时前
【第四章】CSS(二)——文本外观属性与复合选择器
前端·css·经验分享·笔记
kyriewen8 小时前
别再用AI debug了——这5种bug越修越烂
前端·javascript·ai编程
星释9 小时前
鸿蒙智能体开发实战:39.鸿蒙壁纸大师 - 前端卡片显示与交互优化
前端·华为·交互·harmonyos·鸿蒙·火山引擎
顾昂_9 小时前
内存泄漏排查和 Chrome DevTools 使用教程
前端·javascript·面试
IT_陈寒10 小时前
Java线程池这个坑我算是踩明白了
前端·人工智能·后端
An_s10 小时前
rust开发wasm与浏览器(js)交互
javascript·rust·wasm
山河木马11 小时前
GPU自动处理专题4-填充覆盖区域(光栅化)
javascript·webgl·计算机图形学
悦儿遥遥雨111 小时前
PXE + Kickstart 无人值守批量部署系统
linux·javascript·nginx