wssocket.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. let wsurl = "";
  2. let accessToken = "";
  3. let messageCallBack = null;
  4. let closeCallBack = null;
  5. let isConnect = false; //连接标识 避免重复连接
  6. let rec = null;
  7. let isInit = false;
  8. let init = () => {
  9. // 防止重复初始化
  10. if (isInit) {
  11. return;
  12. }
  13. isInit = true;
  14. uni.onSocketOpen((res) => {
  15. console.log("WebSocket连接已打开");
  16. isConnect = true;
  17. // 发送登录命令
  18. let loginInfo = {
  19. cmd: 0,
  20. data: {
  21. accessToken: accessToken
  22. }
  23. };
  24. uni.sendSocketMessage({
  25. data: JSON.stringify(loginInfo)
  26. });
  27. })
  28. uni.onSocketMessage((res) => {
  29. let sendInfo = JSON.parse(res.data)
  30. if (sendInfo.cmd == 0) {
  31. heartCheck.start()
  32. console.log('WebSocket登录成功')
  33. } else if (sendInfo.cmd == 1) {
  34. // 重新开启心跳定时
  35. heartCheck.reset();
  36. } else {
  37. // 其他消息转发出去
  38. console.log("接收到消息", sendInfo);
  39. messageCallBack && messageCallBack(sendInfo.cmd, sendInfo.data)
  40. }
  41. })
  42. uni.onSocketClose((res) => {
  43. console.log('WebSocket连接关闭')
  44. isConnect = false; //断开后修改标识
  45. closeCallBack && closeCallBack(res);
  46. })
  47. uni.onSocketError((e) => {
  48. console.log(e)
  49. isConnect = false; //连接断开修改标识
  50. uni.showModal({
  51. content: '连接失败,可能是websocket服务不可用,请稍后再试',
  52. showCancel: false,
  53. })
  54. })
  55. };
  56. let connect = (url, token) => {
  57. wsurl = url;
  58. accessToken = token;
  59. if (isConnect) {
  60. return;
  61. }
  62. uni.connectSocket({
  63. url: wsurl,
  64. success: (res) => {
  65. console.log("websocket连接成功");
  66. },
  67. fail: (e) => {
  68. console.log(e);
  69. console.log("websocket连接失败,10s后重连");
  70. setTimeout(() => {
  71. connect();
  72. }, 10000)
  73. }
  74. });
  75. }
  76. //定义重连函数
  77. let reconnect = (wsurl, accessToken) => {
  78. console.log("尝试重新连接");
  79. if (isConnect) {
  80. //如果已经连上就不在重连了
  81. return;
  82. }
  83. rec && clearTimeout(rec);
  84. rec = setTimeout(function() { // 延迟15秒重连 避免过多次过频繁请求重连
  85. connect(wsurl, accessToken);
  86. }, 15000);
  87. };
  88. //设置关闭连接
  89. let close = () => {
  90. if (!isConnect) {
  91. return;
  92. }
  93. uni.closeSocket({
  94. code: 3000,
  95. complete: (res) => {
  96. console.log("关闭websocket连接");
  97. isConnect = false;
  98. },
  99. fail: (e) => {
  100. console.log("关闭websocket连接失败", e);
  101. }
  102. });
  103. };
  104. //心跳设置
  105. var heartCheck = {
  106. timeout: 10000, //每段时间发送一次心跳包 这里设置为30s
  107. timeoutObj: null, //延时发送消息对象(启动心跳新建这个对象,收到消息后重置对象)
  108. start: function() {
  109. if (isConnect) {
  110. console.log('发送WebSocket心跳')
  111. let heartBeat = {
  112. cmd: 1,
  113. data: {}
  114. };
  115. uni.sendSocketMessage({
  116. data: JSON.stringify(heartBeat),
  117. fail(res) {
  118. console.log(res);
  119. }
  120. })
  121. }
  122. },
  123. reset: function() {
  124. clearTimeout(this.timeoutObj);
  125. this.timeoutObj = setTimeout(function() {
  126. heartCheck.start();
  127. }, this.timeout);
  128. }
  129. }
  130. // 实际调用的方法
  131. function sendMessage(agentData) {
  132. uni.sendSocketMessage({
  133. data: agentData
  134. })
  135. }
  136. function onMessage(callback) {
  137. messageCallBack = callback;
  138. }
  139. function onClose(callback) {
  140. closeCallBack = callback;
  141. }
  142. // 将方法暴露出去
  143. export {
  144. init,
  145. connect,
  146. reconnect,
  147. close,
  148. sendMessage,
  149. onMessage,
  150. onClose
  151. }