当前位置:   article > 正文

vue中websocket的使用---详解_vue websocket

vue websocket

一、什么是webscoket

WebSockets 是一种先进的技术,它可以在用户的浏览器和服务器之间打开交互式通信会话。使用此 API,可以向服务器发送消息并接收事件驱动的响应,而无需通过轮询服务器的方式以获得响应。

 WebSockets 这种技术中有一个接口名为WebSocket,它是一个用于连接 WebSocket 服务器的主要接口,之后可以在这个连接上发送和接受数据。接下来的案例则是使用该接口创建一个WebSocket对象来进行管理。

二、创建对象

 使用WebSocket接口创建对象,在创建对象之前,判断当前使用的浏览器是否支持该技术,不支持则无法进行一下步操作。

        使用WebSocket接口中的构造器创建对象,构造器中传入要连接的 URL,也就是WebSocket 服务器将响应的 URL。其中ws表示使用的是WebSocket协议;还有一种wss相较于ws更为安全,他们类似于http和https。

  1. if ("WebSocket" in window) {
  2. const resRole = await getUserInfo();
  3. //这里对路径进行了配置,关于.env请看上一篇文章
  4. const wsUrl = process.env.VUE_APP_WEBSOCKET_API + `userCount/${resRole.user.userName}`;
  5. socket = new WebSocket(wsUrl);
  6. //上面两行等价于
  7. socket = new WebSocket("ws://localhost:8080/webSocketServer"); //直接写路径
  8. } else {
  9. Notification.error({
  10. title: "错误",
  11. message: "您的浏览器不支持websocket,请更换Chrome或者Firefox",
  12. });
  13. }

三、处理事件

        在上面对象创建成功的基础上,就可以使用该对象的处理事件了,主要分为以下四种:

事件事件监听器描述
openwebSocket.onopen用于指定链接成功后的回调函数
messagewebSocket.onmessage用于指定当从服务器接受到信息时的回调函数
errorwebSocket.onerror用于指定连接失败后的回调函数
closewebSocket.onclose用于指定链接关闭后的回调函数

四、webSocket基本已经了解,废话不多说直接上完整代码(我写了个js文件)

  1. import { Notification } from "element-ui";
  2. import { getToken } from "../utils/token";
  3. var socket = null;//实例对象
  4. var lockReconnect = false; //是否真正建立连接
  5. var timeout = 20 * 1000; //20秒一次心跳
  6. var timeoutObj = null; //心跳倒计时
  7. var serverTimeoutObj = null; //服务心跳倒计时
  8. var timeoutnum = null; //断开 重连倒计时
  9. const initWebSocket = async () => {
  10. if ("WebSocket" in window) {
  11. const wsUrl = '链接地址';
  12. socket = new WebSocket(wsUrl);
  13. socket.onerror = webSocketOnError;
  14. socket.onmessage = webSocketOnMessage;
  15. socket.onclose = closeWebsocket;
  16. socket.onopen = openWebsocket;
  17. } else {
  18. Notification.error({
  19. title: "错误",
  20. message: "您的浏览器不支持websocket,请更换Chrome或者Firefox",
  21. });
  22. }
  23. }
  24. //建立连接
  25. const openWebsocket = (e) => {
  26. start();
  27. }
  28. const start = ()=> {
  29. //开启心跳
  30. timeoutObj && clearTimeout(timeoutObj);
  31. serverTimeoutObj && clearTimeout(serverTimeoutObj);
  32. timeoutObj = setTimeout(function() {
  33. //这里发送一个心跳,后端收到后,返回一个心跳消息
  34. if (socket.readyState == 1) {
  35. //如果连接正常
  36. // socket.send("heartbeat");
  37. } else {
  38. //否则重连
  39. reconnect();
  40. }
  41. serverTimeoutObj = setTimeout(function() {
  42. //超时关闭
  43. socket.close();
  44. }, timeout);
  45. }, timeout);
  46. }
  47. //重新连接
  48. const reconnect =() => {
  49. if (lockReconnect) {
  50. return;
  51. }
  52. lockReconnect = true;
  53. //没连接上会一直重连,设置延迟避免请求过多
  54. timeoutnum && clearTimeout(timeoutnum);
  55. timeoutnum = setTimeout(function() {
  56. //新连接
  57. initWebSocket();
  58. lockReconnect = false;
  59. }, 1000);
  60. }
  61. //重置心跳
  62. const reset =() => {
  63. //清除时间
  64. clearTimeout(timeoutObj);
  65. clearTimeout(serverTimeoutObj);
  66. //重启心跳
  67. start();
  68. }
  69. const sendWebsocket =(e) =>{
  70. // socket.send(`我发消息了`);
  71. }
  72. const webSocketOnError =(e) => {\
  73. initWebSocket();
  74. reconnect();
  75. }
  76. //服务器返回的数据
  77. const webSocketOnMessage=(e) => {
  78. //判断是否登录
  79. if (getToken()) {
  80. //window自定义事件[下面有说明]
  81. window.dispatchEvent(
  82. new CustomEvent("onmessageWS", {
  83. detail: {
  84. data: JSON.parse(e?.data),
  85. },
  86. })
  87. );
  88. }
  89. reset();
  90. }
  91. const closeWebsocket=(e) => {
  92. reconnect();
  93. }
  94. //断开连接
  95. const close =() => {
  96. //WebSocket对象也有发送和关闭的两个方法,只需要在自定义方法中分别调用send()和close()即可实现。
  97. socket.close();
  98. }
  99. //具体问题具体分析,把需要用到的方法暴露出去
  100. export default { initWebSocket, sendWebsocket, webSocketOnMessage, close };

window自定义事件

//定义
window.dispatchEvent(new CustomEvent("事件名", {参数key:参数value}))
 
//监听
window.addEventListener("事件名", 参数key => {})

五、在main.js中挂载到vue原型上

  1. import websocket from './utils/webSocket';
  2. Vue.prototype.$websocket = websocket;

六、在需要建立连接的组件中这样写

  1. async mounted() {
  2. this.initWebSocket();
  3. },
  4. methods: {
  5. async initWebSocket() {
  6. this.$websocket.initWebSocket();
  7. },
  8. },

七、在需要从服务器获取的数据进行操作的组件中这样写

  1. mounted() {
  2. window.addEventListener("onmessageWS", this.getSocketData);
  3. },
  4. methods: {
  5. getSocketData(res) {
  6. this.PieValue = Number(res.detail.data.sendInfoStr.onlineUserCount);
  7. this.userNumValue = Number(res.detail.data.sendInfoStr.totalUserCount);
  8. },

八、在需要关闭连接的组件(比如退出时需要关闭)中这样写

  1. //退出登录
  2. logOut() {
  3. this.$confirm("确定要退出登录吗?", "提示", {
  4. confirmButtonText: "确定",
  5. cancelButtonText: "取消",
  6. type: "warning",
  7. })
  8. .then(() => {
  9. this.$message({
  10. type: "success",
  11. message: "退出成功!",
  12. });
  13. this.$websocket.close();
  14. localStorage.removeItem("token");
  15. this.$router.push("/login");
  16. }).catch(() => {
  17. this.$message({
  18. type: "info",
  19. message: "已取消退出",
  20. });
  21. });
  22. },

九、除了按钮可以主动关闭WebSocket连接以外,直接关闭浏览器窗口也会关闭连接,故此需要一个窗口监听器,来防止连接还没断开就关闭窗口,服务端出现异常。

  1. //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接
  2. window.onbeforeunload = function () {
  3. websocket.close();
  4. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/164938
推荐阅读
相关标签
  

闽ICP备14008679号