websocket 使用记录

在main.js中 创建websocket连接 (webSocket.js文件在最后)

import webSocket from '@/assets/js/webSocket.js'

Vue.prototype.$webSocket = webSocket
webSocket.initWebSocket()

vuex中储存websocket推送的消息(使用vuex可以在项目任务地方获取socket消息)

const state = {
  socketRes: {}, /* socket消息结果 */
}

const getters = {
  socketRes (state) {
    return state.socketRes
  }
}

const mutations = {
  GET_WEB_SOCKET (state,res) {
    state.socketRes = res
  }
}

const actions = {
  GET_WEB_SOCKET (context, GET_WEB_SOCKET) {
    context.commit('GET_WEB_SOCKET', GET_WEB_SOCKET)
  }
}

export default {
  state,
  getters,
  mutations,
  actions
}

vue文件中获取websocket消息

computed: {
  /* socket消息 */
  socketRes: {
    get () {
      return this.$store.getters.socketRes
    },
    set (val) {
      this.$store.dispatch('GET_WEB_SOCKET', val)
    }
  }
},
watch: { 
  /* socket消息 */
  socketRes: {
    handler (res) {
      console.log(res)
    },
    deep: true,
    immediate: true
  }
}

websocket 配置js文件


import store from '@/store/index';
import {requestUrl} from '@/assets/js/uploadUrl.js'
import CryptoJS from 'crypto-js'
import {setNotice} from '@/assets/js/tool.js'

var webSocket = null

// 初始化webSocket
function initWebSocket() {

  let object = {
		time: (new Date()).getTime()
  }
  let url = requestUrl.socketUrl + '?datas=' + btoa(aesMinEncrypt(JSON.stringify(object)));

	if(WebSocket !== 'undefined') {
		// 创建socket对象并连接后台
		// 有些后台会要求发送socket请求 建立连接 使用send方法连接即可
		if ('WebSocket' in window) {
			webSocket = new WebSocket(url)
		} else if ('MozWebSocket' in window) {
			webSocket = new MozWebSocket(url)
		} else {
			alert('您的浏览器不支持websocket协议,建议使用新版谷歌、火狐等浏览器,请勿使用IE10以下浏览器,360浏览器请使用极速模式,不要使用兼容模式!')
		}

	}else {
		alert("您的浏览器不支持websocket协议,建议使用新版谷歌、火狐等浏览器,请勿使用IE10以下浏览器,360浏览器请使用极速模式,不要使用兼容模式!");
	}
	// 连接成功调用
	webSocket.onopen = function() { 
		ws_open();
	}

	// 接收信息方法
	webSocket.onmessage = function(data) {
		ws_message(data);
	}

	// 关闭方法
	webSocket.onclose = function() {
		console.log('WebSocket连接已关闭')
		ws_close();
	}

	// 连接错误回调
	webSocket.onerror = function() {
		console.log("WebSocket连接发生错误");
		ws_error()
	}
}

/* 重连 */
function reconnect () {
	// initWebSocket()
}

// 加密函数
function aesMinEncrypt(word){
  var _word = CryptoJS.enc.Utf8.parse(word),
    _key = CryptoJS.enc.Utf8.parse("3g-,1~lde^[w`S&5"),
    _iv = CryptoJS.enc.Utf8.parse("%JL<&*l.FsS?:}#1");
  var encrypted = CryptoJS.AES.encrypt(_word, _key, {
    iv: _iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  });
  return encrypted.toString();
}


// 连接成功方法
function ws_open() {
	console.log("WebSocket连接成功!")

	let user = JSON.parse(sessionStorage.getItem('user'))
	
	if (!user) return
	/* 每次连接成功后 请求socket */
	let objects = {
		userId: user.id,
		systemType: setNotice,
		type: 'msg',
	}
	setTimeout(() => {
		sendMsg(objects,()=>{})
	}, 2000)
}

// 接收服务端消息
function ws_message(res) {
	if(!res)  return;
	store.commit('GET_WEB_SOCKET', JSON.parse(res.data))
}
//发送数据
function webSocketSend(data) {
  webSocket.send(JSON.stringify(data));
}

// 连接关闭
function ws_close() {
	reconnect()
}
/* 连接错误 */
function ws_error () {
	reconnect()
}

// 发送
function sendMsg(data) {
	switch (webSocket.readyState) {
		//CONNECTING:值为0,表示正在连接。
		case webSocket.CONNECTING:
			setTimeout(function() {
				webSocketSend(data);
			}, 1000);
			break;
		//OPEN:值为1,表示连接成功,可以通信了。
		case webSocket.OPEN:
			webSocketSend(data);
			break;
		//CLOSING:值为2,表示连接正在关闭。
		case webSocket.CLOSING:
			setTimeout(function() {
				webSocketSend(data);
			}, 1000);
			break;
		//CLOSED:值为3,表示连接已经关闭,或者打开连接失败。
		case webSocket.CLOSED:
			// do something
			break;
		default:
			// this never happens
			break;
	}
}
export default {
  initWebSocket,
  ws_close,
  sendMsg,
  webSocket
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值