socket.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. /* eslint-disable no-unused-vars */
  2. import { Message } from "element-ui";
  3. import { encryptDes, getUuid, sha1_to_base64 } from "./des.js";
  4. import { getToken, setToken } from "@/utils/auth";
  5. class socketClient {
  6. wsUrl = "";
  7. wsAuto = {};
  8. websocket = null;
  9. heartBeatTimer = null;
  10. lockReconnect = false;
  11. errTimer = null;
  12. isLoad = true;
  13. constructor(wsUrl, wsAuto) {
  14. this.wsUrl = wsUrl;
  15. this.wsAuto = wsAuto;
  16. }
  17. // 初始化socket
  18. initWebSocket () {
  19. return new Promise((resolve, reject) => {
  20. this.websocket = new WebSocket(this.wsUrl);
  21. this.wsOpen().then((res) => {
  22. this.isLoad = true;
  23. this.wsSend(this.wsAuto);
  24. this.lockReconnect = true;
  25. resolve(true)
  26. if (this.isLoad == true) {
  27. Message({
  28. message: "客户端连接成功",
  29. type: "success",
  30. duration: 5 * 1000,
  31. });
  32. }
  33. // this.heartBeat();
  34. });
  35. this.websocket.onerror = (evt) => {
  36. this.wsReconnect();
  37. };
  38. this.websocket.onclose = (evt) => {
  39. if (this.isLoad == true) {
  40. Message({
  41. message: "客户端断开连接",
  42. type: "error",
  43. center: true,
  44. duration: 5 * 1000,
  45. });
  46. }
  47. this.isLoad = false;
  48. this.lockReconnect = false;
  49. this.wsReconnect();
  50. };
  51. })
  52. }
  53. // 重新连接
  54. wsReconnect () {
  55. if (this.heartBeatTimer) clearInterval(this.heartBeatTimer);
  56. if (this.errTimer) clearTimeout(this.errTimer);
  57. if (this.lockReconnect) return;
  58. let that = this;
  59. this.errTimer = setTimeout(() => {
  60. that.initWebSocket();
  61. }, 1000);
  62. }
  63. heartBeat () {
  64. this.lockReconnect = false;
  65. if (this.heartBeatTimer) clearInterval(this.heartBeatTimer);
  66. const wsToken = getToken();
  67. // if (wsToken) {
  68. // this.heartBeatTimer = setInterval(() => {
  69. // const heatBeat = `{ MN: "Heart", Token: wsToken }`;
  70. // this.wsSend(heatBeat);
  71. // }, 20000);
  72. // }
  73. }
  74. // 打开连接
  75. wsOpen () {
  76. if (this.websocket) {
  77. return new Promise((resolve, reject) => {
  78. try {
  79. this.websocket.onopen = (evt) => {
  80. resolve(evt);
  81. };
  82. } catch (err) {
  83. this.$message.error('连接已经关闭,正在重新连接中...');
  84. reject(err);
  85. }
  86. });
  87. }
  88. }
  89. // 关闭连接
  90. wsClose () {
  91. if (this.websocket) {
  92. this.websocket.close();
  93. return new Promise((resolve, reject) => {
  94. try {
  95. this.websocket.onclose = (evt) => {
  96. this.$message.error('客户端断开连接');
  97. resolve(evt);
  98. };
  99. } catch (err) {
  100. reject(err);
  101. }
  102. });
  103. }
  104. }
  105. // 监听消息
  106. wsMessage (callback) {
  107. // 需要监听的消息路径
  108. if (this.websocket) {
  109. try {
  110. this.websocket.onmessage = (evt) => {
  111. // 判断是否有 data 数据
  112. if (evt.data) {
  113. let data = evt.data;
  114. if (this.isJsonString(data)) {
  115. callback(JSON.parse(data));
  116. }
  117. }
  118. };
  119. } catch (err) {
  120. callback(err);
  121. }
  122. }
  123. }
  124. // 发送消息
  125. wsSend (options, isFile = false) {
  126. if (this.websocket && this.websocket.readyState === 1) {
  127. try {
  128. if (isFile) {
  129. let params = { ...options };
  130. params.RequestId = getUuid();
  131. this.websocket.send(params);
  132. } else {
  133. this.websocket.send(JSON.stringify(options));
  134. }
  135. } catch (e) {
  136. Message({
  137. message: e.message,
  138. type: "error",
  139. duration: 5 * 1000,
  140. });
  141. }
  142. }
  143. }
  144. // 连接因错误而关闭时触发
  145. wsOnerror () {
  146. if (this.websocket) {
  147. return new Promise((resolve, reject) => {
  148. try {
  149. this.websocket.onerror = (evt) => {
  150. resolve(evt);
  151. };
  152. } catch (err) {
  153. reject(err);
  154. }
  155. });
  156. }
  157. }
  158. // 判断是否是json字符串
  159. isJsonString (str) {
  160. try {
  161. if (typeof JSON.parse(str) == "object") {
  162. return true;
  163. }
  164. } catch (e) {
  165. }
  166. return false;
  167. }
  168. }
  169. export { socketClient };