在之前的一欸文章中,介绍了好几种前端实现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);
});