wssocket.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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 init = () => {
  10. // 防止重复初始化
  11. if (isInit) {
  12. return;
  13. }
  14. isInit = true;
  15. uni.onSocketOpen((res) => {
  16. console.log("WebSocket连接已打开");
  17. isConnect = true;
  18. // 发送登录命令
  19. let loginInfo = {
  20. cmd: 0,
  21. data: {
  22. accessToken: accessToken
  23. }
  24. };
  25. uni.sendSocketMessage({
  26. data: JSON.stringify(loginInfo)
  27. });
  28. })
  29. uni.onSocketMessage((res) => {
  30. let sendInfo = JSON.parse(res.data)
  31. if (sendInfo.cmd == 0) {
  32. heartCheck.start()
  33. connectCallBack && connectCallBack();
  34. console.log('WebSocket登录成功')
  35. } else if (sendInfo.cmd == 1) {
  36. // 重新开启心跳定时
  37. heartCheck.reset();
  38. } else {
  39. // 其他消息转发出去
  40. console.log("接收到消息", sendInfo);
  41. messageCallBack && messageCallBack(sendInfo.cmd, sendInfo.data)
  42. }
  43. })
  44. uni.onSocketClose((res) => {
  45. console.log('WebSocket连接关闭')
  46. isConnect = false;
  47. closeCallBack && closeCallBack(res);
  48. })
  49. uni.onSocketError((e) => {
  50. console.log(e)
  51. isConnect = false;
  52. // APP 应用切出超过一定时间(约1分钟)会触发报错,此处回调给应用进行重连
  53. closeCallBack && closeCallBack({code: 1006});
  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 = (code) => {
  90. if (!isConnect) {
  91. return;
  92. }
  93. uni.closeSocket({
  94. code: code,
  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. let onConnect = (callback) => {
  137. connectCallBack = callback;
  138. }
  139. function onMessage(callback) {
  140. messageCallBack = callback;
  141. }
  142. function onClose(callback) {
  143. closeCallBack = callback;
  144. }
  145. // 将方法暴露出去
  146. export {
  147. init,
  148. connect,
  149. reconnect,
  150. close,
  151. sendMessage,
  152. onConnect,
  153. onMessage,
  154. onClose
  155. }