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,
    });
  })
});
相关推荐
逐·風44 分钟前
unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
前端·unity·c#
Devil枫1 小时前
Vue 3 单元测试与E2E测试
前端·vue.js·单元测试
尚梦2 小时前
uni-app 封装刘海状态栏(适用小程序, h5, 头条小程序)
前端·小程序·uni-app
GIS程序媛—椰子2 小时前
【Vue 全家桶】6、vue-router 路由(更新中)
前端·vue.js
前端青山3 小时前
Node.js-增强 API 安全性和性能优化
开发语言·前端·javascript·性能优化·前端框架·node.js
毕业设计制作和分享3 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
程序媛小果3 小时前
基于java+SpringBoot+Vue的旅游管理系统设计与实现
java·vue.js·spring boot
从兄4 小时前
vue 使用docx-preview 预览替换文档内的特定变量
javascript·vue.js·ecmascript
凉辰5 小时前
设计模式 策略模式 场景Vue (技术提升)
vue.js·设计模式·策略模式
清灵xmf5 小时前
在 Vue 中实现与优化轮询技术
前端·javascript·vue·轮询