vue-socket.io 的使用及其局部引入解决方案

前言

基本的 HTTP 请求可以满足客户端访问数据的需要。如果需要“实时”刷新数据,可以采用轮询(设置一个定时器,每隔很短的一段时间发送 HTTP 请求重新获取数据)或长轮询(long poll,服务端收到 HTTP 请求后,将回调阻塞到有新数据产生)的方式。

轮询需要持续频繁地发送请求,会造成带宽和服务器资源的浪费。
长轮询需要服务器保持长连接,会增加服务器的开销。

相比于以上两种方式,WebSocket 真正实现了实时通讯。
轮询方式的背景是 HTTP 请求的被动性,也即客户端发起一次 Request,有且仅有一次 Response,服务端被动接收客户端的请求来进行操作。说白了,就是服务端没办法主动去跟客户端“说话”。

WebSocket 协议建立在 HTTP 协议的基础上,通过一次 HTTP 请求与服务器建立连接,以订阅-发布的模式让服务端可以主动联系客户端。

订阅-发布模式:客户端使用 主题(topic) 向服务端订阅消息,服务端在相关主题有新消息时,向所有订阅了该主题的客户端发布消息

vue-socket.io 在 vue 中的使用

使用前,强烈建议大家阅读官方文档与源码,也可以看一下知乎的使用介绍

安装依赖

npm install vue-socket.io --save

注:--save 安装的依赖将放在 package.json 中的 dependencies 下。与之对应的 --save-dev 将放在 devDependencies 这个情况下依赖不会打包到 dist 里。WebScoket 是项目运行时必须的依赖,所以只能使用 --save 进行安装。

在 main.js 全局引入模块

import Vue from 'vue'
import store from './store'
import App from './App.vue'
import VueSocketIO from 'vue-socket.io'

Vue.use(new VueSocketIO({
    debug: true,
    connection: 'http://metinseylan.com:1992',
    vuex: {
        store,
        actionPrefix: 'SOCKET_',
        mutationPrefix: 'SOCKET_'
    },
    options: { path: "/my-app/" } //Optional options
}))

new Vue({
    router,
    store,
    render: h => h(App)
}).$mount('#app')

在 main.js 引入模块将自动注册相关对象,可以在任意位置使用:

// 发送信息给服务端
this.$socket.emit('login',{
  username: 'username',
  password: 'password'
});

// 接收服务端的信息
this.sockets.subscribe('relogin', (data) => {
  console.log(data)
})

在模板 .vue 局部引入模块(特殊情况下使用)

在 script 标签内部,创建 socket 全局变量(VueSocketIO 的对象)。

import VueSocketIO from 'vue-socket.io';

var socket = new VueSocketIO({
    debug: true,
    connection: SocketIO(Setting.apiBaseURL),
    vuex(){}
});

在控制台打出 socket 对象,可以看到其内部封装了 io,Emitter,Listener 三个关键对象。稍微看一下,就会发现,io 对象和之前的 this.$socket 是同一个对象,因此可以使用:

// 发送信息给服务端
this.socket.io.emit('login',{
  username: 'username',
  password: 'password'
});

这个时候一个大大的问号就到了笔者的脑子里了,这个 this.sockets 是个什么玩意儿???
查了很多博客,这个 sockets 依旧葆有其神秘的面纱,没办法了,看源码去:

/**
     *  Assign runtime callbacks
     */
    beforeCreate(){

        if(!this.sockets) this.sockets = {};

        this.sockets.subscribe = (event, callback) => {
            this.$vueSocketIo.emitter.addListener(event, callback, this);
        };

        this.sockets.unsubscribe = (event) => {
            this.$vueSocketIo.emitter.removeListener(event, this);
        };

    },

Vue-Socket.io/src/mixin.js 文件里可以找到对 sockets 对象的定义。
很明显,之前的 this.sockets.subscribe 不过是对 Emitter 的小小封装,那么我们就可以使用:

// 接收服务端的信息
socket.emitter.addListener('relogin', (data) => {
  console.log(data)
})

结语

因为项目特殊需要,所以需要在模板中局部引入和使用 vue-socket.io,这个着实难倒了笔者。但也印证了看源码的重要性,查了大量的资料,试了各种奇奇怪怪的可能,不如看下源码,才知道自己被安排的明明白白的。


参考

  1. WebSocket 原理
  2. Vue.js 如何使用 Socket.IO
  3. Vue-Socket.io 源码

个人总结,敬请指正。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Vue2使用vue-socket.io可以实现与Socket.io的集成,实现实时聊天等功能。首先,需要在项目中引入vue-socket.io扩展,可以通过npm安装vue-socket.io引入。 在Vue实例中,使用Vue.use()来注册并使用Vue-socket.io。在注册时,需要传入相应的配置参数,包括debug、connection、vuex等。其中,debug用于调试,可以选择关闭;connection用于指定Socket.io的连接地址;vuex用于在Vuex中使用Socket.io的事件监听。 具体实现步骤如下: 1. 首先,安装vue-socket.io扩展:npm install vue-socket.io 2. 在Vue实例中引入Vue和VueSocketIO,并配置相应的参数。 3. 创建Vuex store,并在配置参数中指定vuex为store的实例。 4. 在Vue实例中使用Vue.use()注册Vue-socket.io,并传入配置参数。 这样,Vue2就可以使用vue-socket.io扩展来实现与Socket.io的集成了。可以使用Vue-socket.io提供的方法来监听Socket事件,并实现相应的功能。 总结一下,Vue2使用vue-socket.io扩展可以实现与Socket.io的集成,通过注册Vue-socket.io并传入相应的配置参数,可以在Vue实例中实现Socket事件的监听和处理。这样就可以实现实时聊天等功能了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Vue 使用 Vue-socket.io 实现即时聊天应用(vuex管理)](https://blog.csdn.net/weixin_47746452/article/details/121330186)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [vue-socket.io-extended:Vue.js和Vuex的Socket.io绑定(受Vue-Socket.io启发)](https://download.csdn.net/download/weixin_42160425/18170249)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Vue 使用 Vue-socket.io 实现即时聊天应用(实战篇 一)](https://blog.csdn.net/weixin_47746452/article/details/121359940)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值