App.vue 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. <script>
  2. export default {
  3. globalData: {
  4. token: "",
  5. // 文本消息
  6. socketTask: null,
  7. urlData: "ws://114.115.147.140:12345/api/api_gateway?method=control_center.real_time.im_message",
  8. is_open_socket: false, // 确保websocket是打开状态
  9. list: [],
  10. userId: null, // 用户ID
  11. // 即构
  12. video: null, //房间密码和token
  13. // 测试 - 心跳检测
  14. status: null, // websocket是否关闭
  15. lockReconnect: false, // 避免重复连接
  16. timeout: 5000, // 多少秒执行监测
  17. timeoutObj: null, // 检测服务器端是否还活着
  18. reconnectTimeOutObj: null, // 重连之后多久再次重连
  19. // 测试
  20. app: [],
  21. hdskdh: null
  22. },
  23. onLoad() {},
  24. onLaunch: function() {
  25. console.log('启动了')
  26. // App启动
  27. var that = this
  28. uni.getStorage({
  29. key: 'session_key',
  30. success: function(res) {
  31. // console.log(res)
  32. that.globalData.token = res.data
  33. // console.log('登录成功了')
  34. that.msgInit(); // 文本初始化
  35. },
  36. fail: function(err) {
  37. // console.log(err)
  38. // console.log('没有登录成功')
  39. }
  40. })
  41. },
  42. onShow: function() {
  43. // App展示在前台
  44. // console.log('App Show')、
  45. },
  46. onHide: function() {
  47. // App不再再展示在前台
  48. // console.log('App Hide')
  49. this.close()
  50. },
  51. methods: {
  52. // 实时通信 - 初始化
  53. msgInit() {
  54. var that = this
  55. // 连接webscoket
  56. that.globalData.socketTask = uni.connectSocket({
  57. url: this.globalData.urlData + "&token=" + that.globalData.token,
  58. success(data) {
  59. console.log("websocket连接成功");
  60. }
  61. });
  62. // 发送消息 - 获取对话列表
  63. var obj = {
  64. 'action': 'list', // 动作标识,必填
  65. 'recv_user_id': '', // 接收人用户id, 非必填
  66. 'data': {}
  67. }
  68. that.globalData.socketTask.onOpen((res) => {
  69. // 清除重连定时器
  70. clearInterval(that.globalData.reconnectTimeOutObj)
  71. // 开启检测
  72. that.start()
  73. that.globalData.socketTask.send({
  74. data: JSON.stringify(obj),
  75. async success(res) {
  76. that.globalData.is_open_socket = true
  77. console.log("消息发送成功");
  78. },
  79. });
  80. })
  81. // // 接收服务器返回的消息
  82. // // 注:只有连接正常打开中 ,才能正常收到消息
  83. that.globalData.socketTask.onMessage((res) => {
  84. console.log("收到服务器内容:");
  85. var val = JSON.parse(res.data)
  86. if (val.action == 'list') {
  87. var obj1 = {
  88. 'action': 'list', // 动作标识,必填
  89. 'recv_user_id': that.globalData.userId, // 接收人用户id, 非必填
  90. 'data': {
  91. 'msg_status': false, // 消息未读
  92. 'msg_info': '', // 发送消息
  93. }
  94. }
  95. that.globalData.socketTask.send({
  96. data: JSON.stringify(obj1),
  97. async success(res) {
  98. // console.log("消息发送成功");
  99. },
  100. });
  101. } else if (val.action == 'none') {
  102. // console.log('进入了')
  103. that.globalData.list = val.data
  104. // console.log(that.globalData.list)
  105. this.$store.state.list = val.data
  106. // console.log(this.$store.state.list)
  107. } else if (val.action == 'recv_video') {
  108. // console.log(val.data)
  109. that.globalData.video = val.data
  110. this.$store.state.video = val.data
  111. // console.log(this.$store.state.video)
  112. }
  113. this.reset();
  114. console.log('消息可正常接收');
  115. });
  116. // console.log(that.socketTask)
  117. // 连接断开
  118. // 如果希望websocket连接一直保持,在close或者error上绑定重新连接方法。
  119. this.globalData.socketTask.onClose((res) => {
  120. console.log(res, '连接关闭');
  121. that.reconnect();
  122. })
  123. // 连接失败
  124. that.globalData.socketTask.onError((res) => {
  125. console.log(res, '连接错误');
  126. that.reconnect();
  127. })
  128. },
  129. // 心跳机制
  130. start() {
  131. // console.log(this.globalData.timeoutObj)
  132. // console.log('进入心跳机制了', this.globalData.timeout)
  133. this.globalData.timeoutObj = setInterval(() => {
  134. //这里发送一个心跳,后端收到后,返回一个心跳消息,
  135. //onmessage拿到返回的心跳就说明连接正常
  136. var obj = {
  137. 'action': 'list', // 动作标识,必填
  138. 'recv_user_id': '', // 接收人用户id, 非必填
  139. 'data': {}
  140. }
  141. this.globalData.socketTask.send(JSON.stringify(obj));
  142. console.log('进入心跳机制了', this.globalData.timeout)
  143. }, this.globalData.timeout)
  144. },
  145. // 清除心跳机制
  146. reset() {
  147. // 清除定时器重新发送一个心跳信息
  148. // clearTimeout(this.globalData.timeoutObj);
  149. clearInterval(this.globalData.timeoutObj);
  150. this.start();
  151. },
  152. // 重连
  153. reconnect() {
  154. // 防止多个方法调用,多处重连
  155. if (this.lockReconnect) {
  156. return;
  157. };
  158. this.lockReconnect = true;
  159. console.log('准备重连');
  160. //没连接上会一直重连,设置延迟避免请求过多
  161. this.globalData.reconnectTimeOutObj = setInterval(() => {
  162. // 重新连接
  163. this.msgInit()
  164. console.log('正在重新连接')
  165. this.lockReconnect = false;
  166. }, 4000);
  167. },
  168. // 手动关闭
  169. close() {
  170. console.log('已经手动关闭了')
  171. this.globalData.socketTask.close()
  172. },
  173. },
  174. }
  175. </script>
  176. <!-- // App.vue文件 中首行的位置引入,注意给style标签加入lang="scss"属性 -->
  177. <style lang="scss">
  178. /* 注意要写在第一行,同时给style标签加入lang="scss"属性 */
  179. @import "uview-ui/index.scss";
  180. </style>