vue基于sockjs-client+stompjs实现websocket客户端

在之前的一欸文章中,介绍了好几种前端实现websocket客户端与服务端通信的方式。本章主要采用的是socketjs的方式。

SockJS 是一个浏览器 JavaScript 库,提供类似 WebSocket 的对象。它为浏览器提供了紧密遵循 HTML5 WebSockets API 的 JavaScript API,并在浏览器和 Web 服务器之间创建了低延迟、全双工、跨域通信通道。

在幕后,SockJS 首先尝试使用原生 WebSocket。如果失败,它还可以使用多种特定于浏览器的传输协议,并通过 WebSocket 类似的抽象呈现它们。SockJS 设计目标是在所有现代浏览器中工作,包括不支持 WebSocket 协议的环境,例如限制性严格的公司代理环境中。

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

在使用上,使用sockjs-client和websocket没有什么区别。主要的实现都可以参考之前一篇文章。本篇只是针对不一样的地方进行说明。

使用sockjs-clien实现websocket需要引入相关组件:

npm install webstomp-client

npm install sockjs-client

建立连接

javascript 复制代码
let customHeaders = {
        "userId":"adafadfafdafdadf",
        "token":"adfafafdasdfafdasfd"
      }
      // 创建SockJS对象
      let socket = new SockJS(this.websocketPath);

      // 创建Stomp客户端实例
      let stompClient = Stomp.over(this.socket);
      // 连接WebSocket
      let stompClient.connect(customHeaders, frame => {
        console.log('Connected: ' + frame);
        this.connected = true
      }, error => {
        console.error('STOMP error:', error);
      });

请求头的设置,可以放在connect时,但是后端无法在握手的拦截器和处理器中获取自定义的请求头信息。

如果想在握手拦截器和处理器获取相关自定义的请求头信息并做处理。SockJS-client 并没有提供直接设置 HTTP 请求头的方法,因为它是通过 WebSocket 连接进行通信的。

但是,如果你需要设置 WebSocket 请求头,你可以通过 SockJS 的 iframe 传输机制来实现。SockJS 使用 iframe 来作为一个传输通道,在这个通道内进行 HTTP 请求,然后通过这个通道建立 WebSocket 连接。你可以在这个 iframe 的初始 HTTP 请求中设置你需要的请求头。jurisdiction操作如下:

javascript 复制代码
let customHeaders = {
        "userId":"adafadfafdafdadf",
        "token":"adfafafdasdfafdasfd"
      }
      // 创建SockJS对象
      let socket = new SockJS(this.websocketPath, null, {
        // 这是传递给传输构造函数的选项对象
        transportOptions: {
          websocket: {
            url: this.websocketPath,
            protocols: ['websocket'],
            // 在这里设置你的自定义请求头
            headers: customHeaders
          }
        }
      });

      // 创建Stomp客户端实例
      let stompClient = Stomp.over(this.socket);
      // 连接WebSocket
      let stompClient.connect(customHeaders, frame => {
        console.log('Connected: ' + frame);
        this.connected = true
      }, error => {
        console.error('STOMP error:', error);
      });
相关推荐
也无晴也无风雨1 小时前
深入剖析输入URL按下回车,浏览器做了什么
前端·后端·计算机网络
Martin -Tang1 小时前
Vue 3 中,ref 和 reactive的区别
前端·javascript·vue.js
FakeOccupational3 小时前
nodejs 020: React语法规则 props和state
前端·javascript·react.js
放逐者-保持本心,方可放逐3 小时前
react 组件应用
开发语言·前端·javascript·react.js·前端框架
曹天骄4 小时前
next中服务端组件共享接口数据
前端·javascript·react.js
阮少年、4 小时前
java后台生成模拟聊天截图并返回给前端
java·开发语言·前端
郝晨妤6 小时前
鸿蒙ArkTS和TS有什么区别?
前端·javascript·typescript·鸿蒙
AvatarGiser6 小时前
《ElementPlus 与 ElementUI 差异集合》Icon 图标 More 差异说明
前端·vue.js·elementui
喝旺仔la6 小时前
vue的样式知识点
前端·javascript·vue.js
别忘了微笑_cuicui6 小时前
elementUI中2个日期组件实现开始时间、结束时间(禁用日期面板、控制开始时间不能超过结束时间的时分秒)实现方案
前端·javascript·elementui