socket应用(vue、node.js、M站)

socket应用(vue、node.js、M站)

前言:我们在做一些项目的时候需要做到实时变化,

比如我们有时候有需求会要求我们做一个类似于聊天室的页面

比如有些时候我们对某些东西进行点赞和刷票,需要实时显示出来

如果我们设置定时刷新内容,是一个比较不合适的事情(定时请求接口对性能会造成影响),所以我们需要socket来为我们提供实时性

Node.js与socket

我这个小项目是用Node自己给自己写的后台,使用了socket.io

首先启动一个socket服务

const server = require('http').createServer(()=>{
    res.end('111')
})
var io = require('socket.io')(server);
server.listen(9002)
//这个socket.io就是我们要使用的插件,
//随便你npm、cnpm还是yarn,把它给加进来
//这个9002是端口号,特指socket的端口号,不要与Node的端口号重复

明确需求触发socket

这个明确需求是什么意思呢,就是现在我们与socket已经建立链接了,那么我们在什么情况下触发socket?

比如我做个这个点赞,就是在用户触发点赞接口的时候,要触发socket

router.post('/updateZan', async (req, res) => {
    //...省略内部操作
    io.emit('msg','update')
})


//其实重点只有最后一句,那就是io.emit
//仔细看看像不像vue 的eventHub
//前面的msg是为这次的socket服务起的名字,
//后面的update就是这次的socket服务要向前端传输的内容

如此,Node.js这里就结束了

让我们镜头一转,看向前端需要哪些操作呢

Vue与socket

vue搭配socket更是方便的不行,因为vue有很多现成的插件

从main.js开始

import VueSocketio from 'vue-socket.io';
import socketio from 'socket.io-client';
//这两个都是插件,给我安排上 Vue.use(VueSocketio, socketio(
'http://localhost:9002/'));//与websocket服务端链接 new Vue({ router, store, sockets: { connect: function () { console.log('socket connected'); } }, render: h => h(App) }).$mount('#app') //还记得我刚刚提醒你们的端口号么,这里不要写错了

这里有个小坑坑,我刚开始只要main.js写成以上这样就会报错

TypeError: Cannot call a class as a function

解决方法:是安装的包版本不太行(具体原因我也不清楚)

  把node_modules删掉,在package.json中把vue-socket.io版本改成"vue-socket.io": "^2.1.1-a"

  然后重新install

  解决

具体的.vue里

与data、methods同级的地方

  sockets:{ //在此接收又服务器发送过来的数据 ps:注意此处的方法名要与服务器的发送的事件保持一致才能接收到
    msg: function (val) {
      console.log('接收到服务端消息1111', val);
      this.getContent()
      this.getCommit()
    }
  },
//还记得msg么,我刚刚起的名字,每当这个时候我就重新调取赞的数量接口,如此就实现了我所需要的实时

m站与socket

m站的原理也是:与后台的socket进行端口号绑定,并且当触发msg事件时,进行操作(我这里是页面强制刷新)

如果有对聊天室特别感兴趣的同学

这里有一份我百度的时候找到的大佬的代码

并且附上大佬的链接

代码在这个链接里有一个如何运行实例,点击下载源码即可。

可以参考 

以上。

原文地址:https://www.cnblogs.com/yangyangxxb/p/10450457.html