vue websocket 使用

基于webSocket通信的库主要有 socket.io,SockJS
关于SockJS的使用
先安装 sockjs-client 和 stompjs

npm install sockjs-client
npm install stompjs

import SockJS from  'sockjs-client';
import  Stomp from 'stompjs';

export default {
    data () {
        return {
            
        }
    },
    methods: {
        // ws连接
        initWebsockt () {
          this.connection()
          // 断开重连,尝试发送消息
          this.socketTimer = setInterval(() => {
            try {
              this.stompClient.send('msg')
            } catch (err) {
              console.log('websocket 请求断开了:', err)
              this.connection()
            }
          }, 5000)
        },
        connection () {
          // 建立连接
          let socket = new SockJS('http://172.16.40.154:9000/messageWarning-websocket')
          // 获取stomp子协议的客户端对象
          this.stompClient = Stomp.over(socket)
          let headers = { Authorization:'' }
          // 发送websocket连接
          this.stompClient.connect(headers,(frame) => {
            console.log('frame is:', frame)
            // 订阅服务
            this.stompClient.subscribe('/topic/messageWarning', (msg) => {
              console.log('广播成功')
              console.log(msg);  // msg.body存放的是服务端发送给我们的信息
            },headers)
          }, (err) => {
              // 连接发生错误时的处理函数
              console.log('失败')
              console.log(err);
          });
        },
        disconnect () {
          if (this.stompClient) {
            this.stompClient.disconnect()
          }
        }
    }
    beforeDestroy () {
        this.disconnect()
        clearInterval(this.socketTimer)
    }
}

sockjs-client

    sockjs-client是从SockJS中分离出来的用于客户端使用的通信模块.所以我们就直接来看看SockJS. SockJS是一个浏览器的JavaScript库,它提供了一个类似于网络的对象,SockJS提供了一个连贯的,跨浏览器的JavaScriptAPI,它在浏览器和Web服务器之间创建了一个低延迟,全双工,跨域通信通道. 你可能会问,我为什么不直接用原生的WebSocket而要使用SockJS呢?这得益于SockJS的一大特性,一些浏览器中缺少对WebSocket的支持,因此,回退选项是必要的,而Spring框架提供了基于SockJS协议的透明的回退选项。SockJS提供了浏览器兼容性,优先使用原生的WebSocket,如果某个浏览器不支持WebSocket,SockJS会自动降级为轮询.

stomjs

    STOMP(Simple Text-Orientated Messaging Protocol) 面向消息的简单文本协议;
WebSocket是一个消息架构,不强制使用任何特定的消息协议,它依赖于应用层解释消息的含义.
与HTTP不同,WebSocket是处在TCP上非常薄的一层,会将字节流转化为文本/二进制消息,因此,对于实际应用来说,WebSocket的通信形式层级过低,因此,可以在 WebSocket 之上使用STOMP协议,来为浏览器 和 server间的 通信增加适当的消息语义。

STOMP与WebSocket 的关系:

    HTTP协议解决了web浏览器发起请求以及web服务器响应请求的细节,假设HTTP协议不存在,只能使用TCP套接字来编写web应用,你可能认为这是一件疯狂的事情;
直接使用WebSocket(SockJS)就很类似于使用TCP套接字来编写web应用,因为没有高层协议,就需要我们定义应用间发送消息的语义,还需要确保连接的两端都能遵循这些语义;
同HTTP在TCP套接字上添加请求-响应模型层一样,STOMP在WebSocket之上提供了一个基于帧的线路格式层,用来定义消息语义.

碰到的问题

    stomp.js:463 WebSocket connection to 'wss://${backend}/websocket' failed: Error during WebSocket handshake: Unexpected response code: 200

    解决方案:修改nginx配置
    部分参考 https://blog.csdn.net/hefeng_aspnet/article/details/142206508

    websocket Whoops! Lost connection to 'schema://${backend}/websocket'
    
    解决方案:后端添加jar包
    https://blog.csdn.net/AaronChen01/article/details/80019294

### Vue.jsWebSocket 的基本用法 在现代 Web 应用程序中,WebSocket 提供了一种全双工通信信道,在单个 TCP 描述符上操作。这意味着服务器可以主动向客户端推送数据而不需要客户端发起请求。对于实时应用来说非常有用。 #### 创建 WebSocket 实例并连接到服务器 为了在 Vue.js 项目里集成 WebSocket 功能,可以在组件内部创建一个新的 `WebSocket` 对象实例来初始化与服务器之间的连接: ```javascript new Vue({ el: '#app', data() { return { socket: null, messages: [] } }, created() { this.initWebSocket() }, methods: { initWebSocket() { const wsUri = 'ws://yourserveraddress'; // 替换成实际地址 this.socket = new WebSocket(wsUri); this.socket.onopen = function(event) { console.log('Connected to server', event); }; this.socket.onerror = function(errorEvent) { console.error('Error occurred:', errorEvent); }; this.socket.onmessage = (event) => { let message = JSON.parse(event.data); this.messages.push(message); // 将接收到的消息存入数组以便后续展示 }; this.socket.onclose = function(closeEvent){ console.warn(`Connection closed (${closeEvent.code}): ${closeEvent.reason}`); } }, sendMessage(msgContent) { if(this.socket.readyState === WebSocket.OPEN){ try{ this.socket.send(JSON.stringify({content: msgContent})); }catch(e){ console.error("Failed sending message:", e.message); } }else{ alert("Socket connection is not open."); } } }, beforeDestroy(){ this.socket.close(); // 销毁前关闭socket连接 } }); ``` 这段代码展示了如何在一个简单的 Vue 组件内设置 WebSocket 客户端[^1]。通过监听不同的事件(打开、错误、消息接收以及关闭),可以根据应用程序的需求处理各种情况下的逻辑响应。此外还定义了一个发送消息的方法 `sendMessage()` 和确保当组件销毁时正确地断开 WebSocket 连接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

csdn_aspnet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值