当前位置:   article > 正文

WebSocket_websocket.open

websocket.open

WebSocket:也是一种协议,基于tcp协议,这里来和Http协议做一个对比

场景:http或https协议只能用来从前端发送请求给后端,而当服务端需要主动给前端发送消息时就没办法实现了,如:聊天系统;如果使用http协议就只能实现发送消息,而不能接收消息(因为接收消息需要服务端主动发送,这时候就需要用到WebSocket来进行通讯了)

websocket协议:ws://或wss://(区别一下http/https)

方法:websocket协议有这么几个方法

1、创建WebSocket对象

websocket = new WebSocket('ws://192.168.x.xxx:8001/api/customerService?token=xxx')

注:直接通过new WebSocket(指定后端url,一般来说传个token身份参数就够了)

2、连接:websocket.onopen

  1. websocket.onopen = webSocketOpen
  2. // 连接成功
  3. function webSocketOpen () {
  4.   console.log('连接成功')
  5. }

3、消息发送:websocket.send

  1. // 注:websocket只能发送字符串,所以如果要发送一个对象的话,可以通过JSON.stringfy转为字符串
  2. websocket.send(JSON.stringify({
  3.     data:{
  4.       message: data,
  5.       type: type,
  6.     }
  7. }));

4、接收消息:websocket.onmessage

  1. websocket.onmessage = webSocketMessage
  2. // 数据接收:传输过来的也是字符串,可以转为JSON对象
  3. function webSocketMessage (e) {
  4. console.log(JSON.parse(e.data))
  5. }

5、连接关闭:websocket.onclose和websocket.close()

5.1 websocket.onclose是监听到连接已关闭,比如网络不好,服务端主动断开连接等;

5.2 websocket.close()是前端主动调用websocket的连接关闭方法

  1. /**
  2. * 监听到连接关闭
  3. */
  4. websocket.onclose = webSocketClose
  5. // 连接关闭
  6. function webSocketClose (e) {
  7. console.log('连接已关闭', e)
  8. }
  9. /**
  10. * 手动关闭连接
  11. */
  12. function closeWebSocket () {
  13. websocket.close()
  14. console.log('已手动关闭连接')
  15. }

6、连接发生错误:websocket.onerror

  1. websocket.onerror = webSocketError
  2. // 连接发生错误
  3. function webSocketError () {
  4. console.log('连接发生错误...')
  5. }

实际在项目中使用,上面代码不方便重复使用,于是需要封装,下面提供一个封装的代码:

  1. /**
  2. * WebSocket通讯工具
  3. */
  4. let websocket = null // webSocket实例
  5. let receiveCallback = null // 消息接收的回调函数
  6. let closeCallback = null // 连接关闭的回调函数
  7. let code = '' // 唯一随机字符串来标志每一次会话
  8. // 初始化websocket
  9. function initWebSocket () {
  10. console.log('VUE_APP_ENV',process.env.VUE_APP_ENV)
  11. let wsUrl = `${process.env.VUE_APP_SOCKET_BASE_URL}/api/customerService?token=${xxx}
  12. websocket = new WebSocket(wsUrl)
  13. code = getUuid()
  14. websocket.onmessage = webSocketMessage
  15. websocket.onclose = webSocketClose
  16. websocket.onopen = webSocketOpen
  17. websocket.onerror = webSocketError
  18. }
  19. // 数据发送 data:需要发送的数据; type:消息类型
  20. function webSocketSend (data, type) {
  21. websocket.send(JSON.stringify({
  22. type: 1,
  23. data:{
  24. code: code,
  25. message: data,
  26. type: type,
  27. }
  28. }));
  29. }
  30. // 连接成功
  31. function webSocketOpen () {
  32. console.log('连接成功')
  33. }
  34. // 数据接收
  35. function webSocketMessage (e) {
  36. receiveCallback(JSON.parse(e.data))
  37. }
  38. // 连接关闭(同上)
  39. function webSocketClose (e) {
  40. closeCallback(e)
  41. }
  42. // 连接发生错误
  43. function webSocketError () {
  44. console.log('连接发生错误...')
  45. }
  46. /**
  47. * 发送消息
  48. * @param data
  49. */
  50. function sendMessage (data, type=messageType.TEXT, parentId=null, uiArea=0) {
  51. if (websocket.readyState === websocket.OPEN) {
  52. // 若是ws开启状态
  53. webSocketSend(data, type)
  54. } else if (websocket.readyState === websocket.CONNECTING) {
  55. // 若是 正在开启状态,则等待1s后重新调用
  56. setTimeout(function () {
  57. sendMessage(data)
  58. }, 1000)
  59. }
  60. }
  61. /**
  62. * 传递接收消息时的回调函数(消息接收之前必须先传一个回调函数给receiveCallback)
  63. * @param callback
  64. */
  65. function transferReceiveCallback (callback) {
  66. receiveCallback = callback
  67. }
  68. /**
  69. * 传递连接关闭时的回调函数(同上)
  70. * @param callback transferCloseCallback
  71. */
  72. function transferCloseCallback (callback) {
  73. closeCallback = callback
  74. }
  75. /**
  76. * 手动关闭连接
  77. */
  78. function closeWebSocket () {
  79. websocket.close()
  80. console.log('已手动关闭连接')
  81. }
  82. /**
  83. * 获取当前会话code
  84. */
  85. function getCode() {
  86. return code
  87. }
  88. // 将方法暴露出去
  89. export default {
  90. initWebSocket,
  91. sendMessage,
  92. transferReceiveCallback,
  93. transferCloseCallback,
  94. closeWebSocket,
  95. getCode
  96. }

在组建中使用:

  1. xx.vue
  2. mounted(){
  3. // 注:接收消息和监听连接关闭的调用要在初始化之前,这样才能接住初始化时的回调赋值
  4. // 接收消息
  5. this.receiveMessage()
  6. // 监听连接关闭
  7. this.connectionClosed()
  8. // 初始化WebSocket(这里就调用到了websocket.js工具里的初始化方法)
  9. webSocketUtil.initWebSocket()
  10. }
  11. // 接收消息
  12. receiveMessage() {
  13. webSocketUtil.transferReceiveCallback((data)=>{
  14. console.log('接收到消息:', data)
  15. })
  16. }
  17. // 监听连接关闭
  18. connectionClosed() {
  19. webSocketUtil.transferCloseCallback((data)=>{
  20. console.log('连接已关闭')
  21. })
  22. },

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/999647
推荐阅读
  

闽ICP备14008679号