wssocket.js 3.5 KB

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