vue中利用socket.io统计在线用户

打印 上一主题 下一主题

主题 492|帖子 492|积分 1476

目录
  一、引入相关模块
  二、store/modules 中封装socketio
  三、后端代码(nodejs)
  
  

一、引入相关模块

main.js 中参考以下代码 ,另外socketio的利用在查阅其它相关文章时有收支,照旧只管以官方文档为准
  1. import VueSocketIO from 'vue-socket.io'
  2. import SocketIO from 'socket.io-client'
  3. const SOCKETIO = new VueSocketIO({
  4.   debug: true, // true开启
  5.   connection: SocketIO('ws://127.0.0.1:8003',{
  6.     autoConnect: false   //不自动连接
  7.   }),
  8.   options: {
  9.     transports: ['websocket']
  10.   },
  11.   vuex: {
  12.     store,
  13.     actionPrefix: 'SOCKET_',
  14.     mutationPrefix: 'SOCKET_'
  15.   }
  16. })
  17. Vue.use(SOCKETIO)
复制代码


二、store/modules 中封装socketio

代码如下:
  1. import io from 'socket.io-client';
  2. import store from '../index';
  3. import moment from 'moment';
  4. let socket = {};
  5. const state = {
  6.     socket: {
  7.         heartbeatActive: false,
  8.         heartbeatInterval: null,
  9.         heartbeatTimeout: null,
  10.         reconnectAttempts: 0,
  11.         maxReconnectAttempts: 5,
  12.     },
  13. }
  14. const mutations = {
  15.     START_HEARTBEAT(state) {
  16.         state.heartbeatActive = true;
  17.     },
  18.     STOP_HEARTBEAT(state) {
  19.         state.heartbeatActive = false;
  20.     },
  21.     SET_HEARTBEAT_INTERVAL(state, interval) {
  22.         state.heartbeatInterval = interval;
  23.     },
  24.     SET_HEARTBEAT_TIMEOUT(state, timeout) {
  25.         state.heartbeatTimeout = timeout;
  26.     },
  27.     INCREMENT_RECONNECT_ATTEMPTS(state) {
  28.         state.reconnectAttempts += 1;
  29.     },
  30.     RESET_RECONNECT_ATTEMPTS(state) {
  31.         state.reconnectAttempts = 0;
  32.     }
  33. }
  34. const actions = {
  35.     connectSocket({ commit, dispatch }) {
  36.         socket=io('http://127.0.0.1:8003'); //socket 服务地址
  37.         socket.connect();
  38.         socket.on('connect', () => {
  39.             console.log('Socket connected');
  40.             dispatch('login');
  41.             commit('START_HEARTBEAT');
  42.             commit('RESET_RECONNECT_ATTEMPTS');
  43.             dispatch('startHeartbeat');
  44.         });
  45.         socket.on('disconnect', () => {
  46.             console.log('Socket disconnected');
  47.             commit('STOP_HEARTBEAT');
  48.             // dispatch('handleReconnect');
  49.         });
  50.         socket.on('pong', () => {
  51.             console.log('Pong received');
  52.             clearTimeout(this.state.heartbeatTimeout);
  53.             dispatch('resetHeartbeatTimeout');
  54.         });
  55.     },
  56.     login() {
  57.         socket.emit('login',{ usercode: store.getters['name'],loginTime: moment().format('YYYY-MM-DD HH:mm:ss') });
  58.     },
  59.     disconnectSocket({ commit }) {
  60.         socket.disconnect();
  61.         clearInterval(state.heartbeatInterval);
  62.         clearTimeout(state.heartbeatTimeout);
  63.         commit('STOP_HEARTBEAT');
  64.     },
  65.     startHeartbeat({ commit, dispatch }) {
  66.         const heartbeatInterval = setInterval(() => {
  67.             console.log('user/usercode', store.getters['name'])
  68.             //发送心跳包
  69.             socket.emit('ping', { usercode: store.getters['name'],lastLoginTime: moment().format('YYYY-MM-DD HH:mm:ss') });
  70.             dispatch('resetHeartbeatTimeout');
  71.         }, 25000);
  72.         commit('SET_HEARTBEAT_INTERVAL', heartbeatInterval);
  73.     },
  74.     resetHeartbeatTimeout({ commit, state, dispatch }) {
  75.         if (state.heartbeatTimeout) {
  76.             clearTimeout(state.heartbeatTimeout);
  77.         }
  78.         const heartbeatTimeout = setTimeout(() => {
  79.             console.log('Heartbeat timeout, attempting to reconnect');
  80.             dispatch('stopHeartbeat');
  81.             dispatch('connectSocket');
  82.         }, 30000); // 设置超时时间
  83.         commit('SET_HEARTBEAT_TIMEOUT', heartbeatTimeout);
  84.     },
  85.     stopHeartbeat({ commit, state }) {
  86.         clearInterval(state.heartbeatInterval);
  87.         clearTimeout(state.heartbeatTimeout);
  88.         commit('STOP_HEARTBEAT');
  89.     },
  90.     handleReconnect({ commit, state, dispatch }) {
  91.         if (state.reconnectAttempts < state.maxReconnectAttempts) {
  92.             commit('INCREMENT_RECONNECT_ATTEMPTS');
  93.             setTimeout(() => {
  94.                 dispatch('connectSocket');
  95.             }, 5000); // 重连间隔
  96.         } else {
  97.             console.log('Max reconnect attempts reached');
  98.         }
  99.     }
  100. }
  101. export default {
  102.     namespaced: true,
  103.     state,
  104.     mutations,
  105.     actions
  106. }
复制代码
触发变乱写在了AppMain.vue中
  1. export default {
  2.   name: 'AppMain',
  3.   computed: {
  4.     cachedViews() {
  5.       return this.$store.state.tagsView.cachedViews
  6.     },
  7.     key() {
  8.       return this.$route.fullPath
  9.     }
  10.   },
  11.   mounted() {
  12.     this.$store.dispatch('socketio/connectSocket'); //登陆成功后手动连接
  13.     }
  14. }
复制代码
三、后端代码(nodejs)

单独封装了一个 socketio.js文件,这个根据个人喜好处置惩罚,简单样例代码
  1. global.socketClients= new Map();
  2. global.io.on('connection', (socket) => {
  3.     console.log('a user connected');
  4.    
  5.     socket.on('login', (data) => {
  6.         console.log('login',data);
  7.         global.socketClients.set(data.usercode,data);
  8.         console.log(global.socketClients);
  9.     });
  10.    
  11.     socket.on('ping', (data) => {
  12.         console.log('received heartbeat');
  13.         console.log('ping',data);
  14.         if(global.socketClients.has(data.usercode)){
  15.             global.socketClients.set(data.usercode,_.assign(global.socketClients.get(data.usercode),data));
  16.         }else{
  17.             global.socketClients.set(data.usercode,data);
  18.         }
  19.         console.log(global.socketClients);
  20.     });
  21.     socket.on('disconnect', (reason) => {
  22.         if (reason === 'ping timeout') {
  23.             console.log('Client disconnected due to heartbeat timeout');
  24.         } else {
  25.             console.log('Client disconnected due to:', reason);
  26.         }
  27.     });
  28. });
复制代码
相关数据可以用redis,或者放到表中进行一些其它逻辑的处置惩罚
附上后端示例:

前端列表:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

李优秀

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表