wssocket.js 3.1 KB

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