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);
      });
相关推荐
蜗牛前端16 分钟前
codex 全流程开发上线的高颜值礼簿小程序
前端·微信小程序
大龄秃头程序员1 小时前
我在图文流 App 里落地双层缓存、弱网降级与 OOM 治理
前端
老王以为1 小时前
React Renderer 分离的多平台架构
前端·react native·react.js
hunterandroid1 小时前
Kotlin Coroutines 与 Flow:让异步任务更清晰
前端
Bigger2 小时前
从零搭建 AI 代码审查服务:一份前端也能看懂的 Python 学习笔记
前端·ci/cd·ai编程
lichenyang4532 小时前
JSAPI、NAPI、Biz、Imp:ASCF Demo 如何真正调用系统能力和 C++ 能力
前端
lichenyang4532 小时前
IPC、JSVM、UIThread、libuv:ASCF 架构图里最容易混的几个词
前端
用户059540174462 小时前
Redis记忆存储故障恢复测试踩坑实录:手动测试让我漏掉了2个一致性Bug
前端·css
用户2136610035722 小时前
Vue2脚手架工程化与Axios集成
前端·vue.js
用户83134859306982 小时前
Cesium实现黄昏效果:按钮一键控制打开/关闭黄昏效果,滑块拖动实时控制黄昏浓烈度
vue.js·cesium