socket.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import store from '@/store/index.js'
  2. import method from '@/common/methodTool'
  3. let isSocketClose = false; // 是否关闭socket
  4. let heartbeatInterval = null; // 心跳定时器
  5. let socketTask = null; // websocket对象
  6. let againTimer = null; //断线重连定时器
  7. let url = null;
  8. /**
  9. * sockeUrl:websocet的地址
  10. * */
  11. const sokcet = (sockeUrl) => {
  12. url = sockeUrl;
  13. isSocketClose = false;
  14. //判断是否有websocet对象,有的话清空
  15. if (socketTask) {
  16. socketTask.close();
  17. socketTask = null;
  18. clearInterval(heartbeatInterval);
  19. }
  20. // 连接
  21. console.log(url)
  22. socketTask = uni.connectSocket({
  23. url: url,
  24. success(data) {
  25. console.log("websocket连接成功");
  26. clearInterval(againTimer) //断线重连定时器
  27. },
  28. fail: (err) => {
  29. console.log("报错", err);
  30. }
  31. });
  32. // 连接打开
  33. socketTask.onOpen((res) => {
  34. console.log('WebSocket打开');
  35. clearInterval(againTimer) //断线重连定时器
  36. clearInterval(heartbeatInterval);
  37. // 10秒发送一次心跳
  38. heartbeatInterval = setInterval(() => {
  39. sendMsg('心跳ing')
  40. }, 10000)
  41. })
  42. // 监听连接失败
  43. socketTask.onError((err) => {
  44. console.log('WebSocket连接打开失败,请检查', err);
  45. //停止发送心跳
  46. clearInterval(heartbeatInterval)
  47. //如果不是人为关闭的话,进行重连
  48. if (!isSocketClose) {
  49. reconnect(url)
  50. }
  51. })
  52. // // 监听连接关闭 -
  53. socketTask.onClose((e) => {
  54. console.log('WebSocket连接关闭!',e);
  55. clearInterval(heartbeatInterval)
  56. if (!isSocketClose) {
  57. reconnect(url)
  58. }
  59. })
  60. // 监听收到信息
  61. socketTask.onMessage((res) => {
  62. console.log(res, 'res监听收到信息')
  63. // stop();
  64. // uni.setStorageSync('needToLogin','1')
  65. // uni.showToast({
  66. // icon:'none',
  67. // title:'用户在其他终端登录,强制下线',
  68. // duration:2000,
  69. // })
  70. // setTimeout(() => {
  71. // method.exit();
  72. // },2000)
  73. });
  74. }
  75. const reconnect = (url) => {
  76. console.log('进入断线重连', isSocketClose);
  77. clearInterval(againTimer) //断线重连定时器
  78. clearInterval(heartbeatInterval);
  79. console.log(socketTask)
  80. socketTask && socketTask.close(); // 确保已经关闭后再重新打开
  81. socketTask = null;
  82. // 连接 重新调用创建websocet方法
  83. againTimer = setInterval(() => {
  84. sokcet(url)
  85. console.log('在重新连接中...');
  86. }, 30000)
  87. }
  88. const sendMsg = (msg) => { //向后端发送命令
  89. console.log(msg)
  90. try {
  91. //通过 WebSocket 连接发送数据
  92. socketTask.send({
  93. data:msg
  94. });
  95. } catch (e) {
  96. console.log(e,'msg')
  97. if (isSocketClose) {
  98. return
  99. } else {
  100. reconnect(url)
  101. }
  102. }
  103. }
  104. const stop = () => {
  105. isSocketClose = true
  106. clearInterval(heartbeatInterval);
  107. clearInterval(againTimer) //断线重连定时器
  108. socketTask && socketTask.close(); // 确保已经关闭后再重新打开
  109. socketTask = null;
  110. }
  111. export const websocket = {
  112. sokcet,
  113. stop,
  114. sendMsg
  115. };