【Websocket】、【vue】封装websocket并将方法注入window中

背景:在vue中使用websocket其实非常简单,建立对话,发送消息,断开连接,如果连接失败需要接收错误信息并断开连接。

那么先来简单介绍一下在vue中使用websocket的代码片,然后再介绍如何将websocket封装到外部在window中全局调用。

一、websokcet简介

1.websocket是一个基于在TCP的全双工通信协议,它的协议为ws或者wss,即对应http协议和https协议。
2.websocket只需要建立一次连接,即可收发消息,直到断开连接。

二、在vue中使用websocket

在一个.vue文件中,定义方法

handleWebsocket(){
	let ws = new WebSocket("ws://xxx.xxx.x.xxx:9090")//ws根据需要更改
	//打开websocket
	ws.onopen = (e) => {
		console.log('open------------------',e)
		//打开后发送数据,需要写在open里,否则在对话没有打开之前无法执行send
		let data = {
			'op':'message'
		}
		ws.send(JSON.stringify(data)) //send括号中的内容可以根据实际情况进行更改
	}
	//接收消息,e为接收到的消息,一般是存在e.data中,可以打印出来看一下e中有什么
	ws.onmessage = (e) => {
		console.log('message----------------',e)
		console.log(JSON.parse(e.data))
	}
	//错误回调,如遇到错误则让连接自动关闭
	ws.onerror = (e) => {
		ws.close()
		console.log('建立连接失败--------------',e)
	}
}

三、将websocket封装在js中并保存与window中,在.vue页面中调用

1.在项目中新建一个工具文件,我是存放于src下新建的util的文件夹中,起名为websocket.js

websocket.js

	var websocketStore = {}  //定义一个空的对象
	websocketStore.data = ""//存放接收到数据
	websocketStore.ws = "" //存储ws
	// 初始化建立连接
	websocketStore.initWebsocket = () => {
    	websocketStore.ws = new WebSocket("ws://xxx.xxx.x.xxx:9090");
    	websocketStore.ws.onopen = function (event) {
        	console.log("open...------------------------------------------");
        	console.log(event);
        	let a = {
            	"op": "subscribe"
        	}
        	websocketStore.ws.send(JSON.stringify(a))
    	};

    	websocketStore.ws.onmessage = (e) => {
        	console.log("message===============")
        	let data = e.data
        	data = JSON.parse(data)
        	websocketStore.data = data
    	}
    	websocketStore.ws.onerror = function (event) {
        	console.log("建立连接--失败");
        	//关闭连接
        	websocketStore.ws.close();
    	};
	}
	//发送消息并接受(这里是如果有多个消息需要发送才去定义的一个方法)
	websocketStore.sendMsg = (e) => {
    	websocketStore.ws.send(e)
    	websocketStore.ws.onmessage = (e) => {
        	console.log("message...");
        	console.log(e)
    	}
	}
	//断开连接(如果需要在某个实际情况下需要手动断开连接,比如页面销毁,页面关闭等需要去触发一次点开连接定义的方法)
	websocketStore.handleOff = () => {
    	websocketStore.ws.close();
    	console.log("close-=-=--=-=-=-=-=-=")
    	websocketStore.data=""
	}
	export default websocketStore;
2.在index.vue中将webswocket.js注册到window中

即在项目最开始初始化的时候注册
1.在script中引入websocket

import websocketStore from '../utils/websocket';

2.在index.vue的created中写下如下代码

created() {
  window.websocketStore = websocketStore;
},
3.使用websocket

在需要使用websocket的.vue页面使用,代码如下

//点击按钮连接
connectLine(){
	window.websocketStore.initWebsocket(); //建立websocket连接并发送消息,initWebsocket方法在websocket.js文件中定义,可以根据自己的需求进行修改
	let data = window.websocket.data // data为websocket中请求回来返回的data
}
//手动断开连接
turnOffLine(){
	window.websocketStore.handleOff()
}

注意:
服务端如果在建立连接后轮询发消息,那么在websocket.js中onmessage方法中可以打印出轮询的消息,如果需要在页面中使用,可以在.vue页面中使用定时器轮询拿onmessage存储的消息,或者直接在.vue页面中使用websocket,无需再声明一个js文件。如何使用,根据你的情况而定。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的 Vue WebSocket 方法封装的示例: ```js import { mapActions } from 'vuex' export default { methods: { ...mapActions('websocket', ['initWebSocket', 'closeWebSocket', 'sendMessage']), connect() { const url = 'ws://localhost:8080/ws' const protocols = ['protocol1', 'protocol2'] this.initWebSocket({ url, protocols }) }, disconnect() { this.closeWebSocket() }, send(msg) { this.sendMessage(msg) } } } ``` 在上面的代码,我们使用了 Vuex 来管理 WebSocket 的状态,具体实现请看如下代码: ```js import Vue from 'vue' const state = { socket: null } const getters = { socket: state => state.socket } const actions = { initWebSocket({ commit }, { url, protocols }) { const socket = new WebSocket(url, protocols) commit('setSocket', socket) socket.addEventListener('open', () => { console.log('WebSocket connected') }) socket.addEventListener('close', () => { console.log('WebSocket disconnected') }) socket.addEventListener('message', event => { console.log(`WebSocket received message: ${event.data}`) }) }, closeWebSocket({ commit, state }) { if (state.socket) { state.socket.close() commit('setSocket', null) } }, sendMessage({ state }, message) { if (state.socket) { state.socket.send(message) } } } const mutations = { setSocket(state, socket) { state.socket = socket } } export default { namespaced: true, state, getters, actions, mutations } ``` 在上面的代码,我们定义了 `initWebSocket`、`closeWebSocket` 和 `sendMessage` 三个方法,其 `initWebSocket` 方法用于初始化 WebSocket,`closeWebSocket` 方法用于关闭 WebSocket,`sendMessage` 方法用于发送消息。 我们在 Vuex 的 `state` 定义了 `socket` 属性来存储 WebSocket 的实例。在 `initWebSocket` 方法,我们使用 `new WebSocket(url, protocols)` 创建了一个 WebSocket 实例,并通过 `commit` 方法将其存储到 `state` 。在成功连接、断开连接和接收到消息时,我们分别打印了一些信息,以便于调试。在 `closeWebSocket` 方法,我们先检查 `socket` 是否存在,如果存在则关闭它,并将 `state` 的 `socket` 属性设置为 `null`。在 `sendMessage` 方法,我们也先检查 `socket` 是否存在,如果存在则调用它的 `send` 方法发送消息。 最后,在 Vue 组件,我们用 `mapActions` 将 `websocket` 模块的 `initWebSocket`、`closeWebSocket` 和 `sendMessage` 方法映射为组件的方法,并在组件使用这些方法来连接、断开连接和发送消息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值