wssocket.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. var websock = null;
  2. let rec; //断线重连后,延迟5秒重新创建WebSocket连接 rec用来存储延迟请求的代码
  3. let isConnect = false; //连接标识 避免重复连接
  4. let connectCallBack= null;
  5. let messageCallBack = null;
  6. let closeCallBack = null
  7. let connect = (wsurl,accessToken) => {
  8. try {
  9. if (isConnect) {
  10. return;
  11. }
  12. console.log("连接WebSocket");
  13. websock = new WebSocket(wsurl);
  14. websock.onmessage = function(e) {
  15. let sendInfo = JSON.parse(e.data)
  16. if (sendInfo.cmd == 0) {
  17. heartCheck.start()
  18. // 登录成功才算真正完成连接
  19. connectCallBack && connectCallBack();
  20. console.log('WebSocket登录成功')
  21. } else if (sendInfo.cmd == 1) {
  22. // 重新开启心跳定时
  23. heartCheck.reset();
  24. } else {
  25. // 其他消息转发出去
  26. console.log("收到消息:",sendInfo);
  27. messageCallBack && messageCallBack(sendInfo.cmd, sendInfo.data)
  28. }
  29. }
  30. websock.onclose = function(e) {
  31. console.log('WebSocket连接关闭')
  32. isConnect = false; //断开后修改标识
  33. closeCallBack && closeCallBack(e);
  34. }
  35. websock.onopen = function() {
  36. console.log("WebSocket连接成功");
  37. isConnect = true;
  38. // 发送登录命令
  39. let loginInfo = {
  40. cmd: 0,
  41. data: {
  42. accessToken: accessToken
  43. }
  44. };
  45. websock.send(JSON.stringify(loginInfo));
  46. }
  47. // 连接发生错误的回调方法
  48. websock.onerror = function() {
  49. console.log('WebSocket连接发生错误')
  50. isConnect = false; //连接断开修改标识
  51. reconnect(wsurl,accessToken);
  52. }
  53. } catch (e) {
  54. console.log("尝试创建连接失败");
  55. reconnect(wsurl,accessToken); //如果无法连接上webSocket 那么重新连接!可能会因为服务器重新部署,或者短暂断网等导致无法创建连接
  56. }
  57. };
  58. //定义重连函数
  59. let reconnect = (wsurl,accessToken) => {
  60. console.log("尝试重新连接");
  61. if (isConnect){
  62. //如果已经连上就不在重连了
  63. return;
  64. }
  65. rec && clearTimeout(rec);
  66. rec = setTimeout(function() { // 延迟5秒重连 避免过多次过频繁请求重连
  67. connect(wsurl,accessToken);
  68. }, 15000);
  69. };
  70. //设置关闭连接
  71. let close = (code) => {
  72. websock && websock.close(code);
  73. };
  74. //心跳设置
  75. let heartCheck = {
  76. timeout: 5000, //每段时间发送一次心跳包 这里设置为20s
  77. timeoutObj: null, //延时发送消息对象(启动心跳新建这个对象,收到消息后重置对象)
  78. start: function() {
  79. if (isConnect) {
  80. console.log('发送WebSocket心跳')
  81. let heartBeat = {
  82. cmd: 1,
  83. data: {}
  84. };
  85. websock.send(JSON.stringify(heartBeat))
  86. }
  87. },
  88. reset: function() {
  89. clearTimeout(this.timeoutObj);
  90. this.timeoutObj = setTimeout(function() {
  91. heartCheck.start();
  92. }, this.timeout);
  93. }
  94. };
  95. // 实际调用的方法
  96. let sendMessage = (agentData) => {
  97. // console.log(globalCallback)
  98. if (websock.readyState === websock.OPEN) {
  99. // 若是ws开启状态
  100. websock.send(JSON.stringify(agentData))
  101. } else if (websock.readyState === websock.CONNECTING) {
  102. // 若是 正在开启状态,则等待1s后重新调用
  103. setTimeout(function() {
  104. sendMessage(agentData)
  105. }, 1000)
  106. } else {
  107. // 若未开启 ,则等待1s后重新调用
  108. setTimeout(function() {
  109. sendMessage(agentData)
  110. }, 1000)
  111. }
  112. }
  113. let onConnect = (callback) => {
  114. connectCallBack = callback;
  115. }
  116. let onMessage = (callback) => {
  117. messageCallBack = callback;
  118. }
  119. let onClose = (callback) => {
  120. closeCallBack = callback;
  121. }
  122. // 将方法暴露出去
  123. export {
  124. connect,
  125. reconnect,
  126. close,
  127. sendMessage,
  128. onConnect,
  129. onMessage,
  130. onClose,
  131. }