websocket.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import Stomp from 'stompjs'
  2. let socketOpen = false
  3. let socketMsgQueue = []
  4. export default {
  5. client: null,
  6. init(url, header, connectWS) {
  7. if (this.client) {
  8. return Promise.resolve(this.client)
  9. }
  10. return new Promise((resolve, reject) => {
  11. const ws = {
  12. send: this.sendMessage,
  13. onopen: null,
  14. onmessage: null,
  15. }
  16. uni.connectSocket({
  17. url,
  18. header
  19. })
  20. uni.onSocketOpen(function(res) {
  21. console.log('WebSocket连接已打开!', res)
  22. socketOpen = true
  23. for (let i = 0; i < socketMsgQueue.length; i++) {
  24. ws.send(socketMsgQueue[i])
  25. }
  26. socketMsgQueue = []
  27. ws.onopen && ws.onopen()
  28. })
  29. uni.onSocketMessage(function(res) {
  30. // ios 缺少 0x00 导致解析失败
  31. if (res && res.data) {
  32. let value = res.data;
  33. let code = value.charCodeAt(value.length - 1);
  34. if (code !== 0x00) {
  35. value += String.fromCharCode(0x00);
  36. res.data = value;
  37. }
  38. }
  39. ws.onmessage && ws.onmessage(res)
  40. })
  41. uni.onSocketError(function(res) {
  42. console.log('WebSocket 错误!', res)
  43. })
  44. uni.onSocketClose((res) => {
  45. this.client = null
  46. socketOpen = false
  47. console.log('WebSocket 已关闭!', res)
  48. if (res.code !== 1000) {
  49. setTimeout(() => {
  50. connectWS()
  51. }, 3000)
  52. }
  53. })
  54. Stomp.setInterval = function(interval, f) {
  55. return setInterval(f, interval)
  56. }
  57. Stomp.clearInterval = function(id) {
  58. return clearInterval(id)
  59. }
  60. const client = (this.client = Stomp.over(ws))
  61. // 关闭连接
  62. client.close = () => {
  63. uni.closeSocket()
  64. }
  65. client.connect(header, function() {
  66. console.log('stomp connected')
  67. resolve(client)
  68. })
  69. })
  70. },
  71. sendMessage(message) {
  72. if (socketOpen) {
  73. uni.sendSocketMessage({
  74. data: message,
  75. })
  76. } else {
  77. socketMsgQueue.push(message)
  78. }
  79. },
  80. }