websockt 最大的优势就是后端能够向前端实时推送数据,而前端只需要一个监听,就能够实现数据的相应变化
<template>
<div>
<button @click="freeLowControl">弹出下控页面</button>
<!-- 下控弹框 -->
<el-dialog title="提示" :visible.sync="dialogVisibleCtl" width="30%">
<div style="text-align:left">
<p class="lineHeight">是否确认下控 ?</p>
<p class="lineHeight">
<p>日志信息:</p>
<p style="color:red" v-html="record"></p>
</p>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisibleCtl = false" size="mini">关 闭</el-button>
<el-button type="primary" @click="saveControlSing" size="mini" :loading="loading" id="contrlBtn">确 定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
export default {
data() {
return {
soket: "",
socktPath: "", //WebSocket地址,
sendVal: "", //发送数据
dialogVisibleCtl: false
};
},
methods: {
//初始化webSockt
initWebsocket() {
this.socktPath =
window.$url_front.webSocketUrl + "/socketServer/" + JSON.parse(localStorage.userMsg).id;
if (typeof WebSocket === "undefined") {
alert("您的浏览器不支持socket");
} else {
// 实例化socket
this.socket = new WebSocket(this.socktPath);
//监听socket连接;
this.socket.onopen = this.open;
// 监听socket错误信息
this.socket.onerror = this.error;
// 监听socket消息
this.socket.onmessage = this.getMessage;
// 关闭连接
this.socket.onclose = this.close;
}
},
//websocket连接成功的回调方法
open() {
console.log("socket连接成功", this.socket);
//每次连接成功,把上次交互所保存的信息给删除掉,将loading设为false,允许操作;
this.record = "";
this.loading = false;
//连接成功后,向后端发送数据
this.sendData();
},
//websocket连接失败的回调方法
error() {
console.log("连接失败.");
//设置record以及loading为true,不让用户继续操作
this.record = "ws连接失败...";
this.loading = true;
},
//websocket获取数据的回调方法
getMessage(msg) {
this.record = msg.data;
console.log("返回数据=========", msg);
},
sendData() {
this.sendVal =
"underControl;" + JSON.parse(localStorage.userMsg).id + ";" + String(new Date().getTime()); //前端和后端做一个约定,来确定发送数据的格式;非常关键
this.sendTime = String(new Date().getTime());
//发送数据
// this.socket.readyState : 一般情况 0代表连接成功 1代表失败
if (this.socket.readyState == 1) {
this.socket.send(this.sendVal);
}
},
freeLowControl() {
this.dialogVisible = true;
this.initWebSocket()
},
//下控确定
saveControlSing() {
//socket.readyState 是否连接成功
let contrlBtn = document.getElementById("contrlBtn");
contrlBtn.innerHTML = "请求中...";
this.loading = true;
setTimeout(() => {
if (this.socket.readyState == 1) {
let pointArr = this.tablePoint.pointDataList;
let pointList = [];
pointArr.forEach(item => {
let obj = {};
obj.data_id = item.data_id;
obj.value = item.lowControlVal;
pointList.push(obj);
});
let parm = {
token: this.token,
points_values: JSON.stringify(pointList),
wid: this.sendTime
};
api_lak.underControlByFree(qs.stringify(parm)).then(res => {
if (res) {
this.$emit("refreshDataSet", this.tablePoint.under_id);
//成功后 设置loading为false 允许用户的下次操作
this.loading = false;
contrlBtn.innerHTML = "确定";
}
});
} else {
this.$message({ message: "webSocket连接失败", type: "error" });
this.$emit("refreshDataSet", this.tablePoint.under_id);
}
}, 1000);
}
}
};
</script>