wssocket.js 3.0 KB

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