WebSocket:
- 它是一种网络通信协议,提供全双工通信通道,使客户端和服务器之间可以实时交换数据。
- WebSocket 需要通过 HTTP/HTTPS 协议发起一条特殊的请求进行握手,之后创建一个用于交换数据的 TCP 连接。
- 它适用于需要即时反馈的应用,如聊天、股票交易、游戏等对实时性要求较高的行业领域。
- WebSocket 的缺点包括对老旧浏览器的兼容性问题以及需要额外配置 SSL/TLS 加密通信。
SockJS:
- SockJS 是一个 JavaScript 库,提供了一个类似于 WebSocket 的 API,但可以在不同的传输层上工作,包括 XHR、JSONP、EventSource 等。
- 它旨在解决许多浏览器不支持 WebSocket 协议的问题,提供了备选方案。SockJS 会尽可能对应 WebSocket API,但如果 WebSocket 技术不可用,会自动降为轮询的方式。
- SockJS 的特点包括兼容性、稳定性和易于使用。它支持多种浏览器和网络环境,确保良好的兼容性。
STOMP:
-
STOMP(Simple Text Oriented Messaging Protocol)是一种简单的文本协议,用于通过 WebSocket 进行消息传递。
-
它定义了客户端和服务器之间的命令和消息格式,以便它们之间可以相互通信。STOMP 提供了多种客户端和服务器实现,支持多种语言和平台。
-
STOMP 的优点包括跨平台支持、易用性和可扩展性。它允许通过插件和扩展来定制消息处理逻辑。
-
STOMP 在 WebSocket 之上提供了一个基于帧的线路格式层,用来定义消息语义,使得消息通信更加结构化和可预测。
三者区别
总结来说,WebSocket 是一种底层的通信协议,而 SockJS 提供了对 WebSocket 的兼容性支持,并在 WebSocket 不可用时提供备选方案。STOMP 则在 WebSocket(或 SockJS)的基础上提供了一个上层的消息协议,增加了消息的语义和结构。
sockjs 后端使用 stomp 遇到问题CONNECT出现1007连接不上
!connect-with-ios-and-android-clients-to-sockjs-backend
错误:Server didn't pong heart-beat on time. Last received at 61 seconds ago.
websocket 常见错误码
在 STOMP 协议中,关闭(close)操作通常涉及到 WebSocket 的关闭状态码。根据 WebSocket 规范,当关闭一个连接时,可以指定一个状态码和可选的原因字符串来解释关闭的原因。如果关闭帧中没有包含状态码,默认状态码为1005,表示没有收到预期的状态码。
WebSocket 定义了一组标准的状态码,用于表示关闭的原因,以下是一些常见的状态码:
- 1000:正常关闭,意味着连接建立的目标已经完成了。
- 1001:终端离开,可能因为服务端错误,也可能因为浏览器正从打开连接的页面跳转离开。
- 1002:由于协议错误而中断连接。
- 1003:由于接收到不允许的数据类型而断开连接(如仅接收文本数据的终端接收到了二进制数据)。
- 1004:保留,其意义可能会在未来定义。
- 1005:保留,表示没有收到预期的状态码。
- 1006:用于期望收到状态码时连接非正常关闭(也就是说,没有发送关闭帧)。
- 1007:由于收到了格式不符的数据而断开连接(如文本消息中包含了非 UTF-8 数据)。
- 1008:由于收到不符合约定的数据而断开连接。
- 1009:由于收到过大的数据帧而断开连接。
- 1010:客户端期望服务器商定一个或多个拓展,但服务器没有处理,因此客户端断开连接。
- 1011:客户端由于遇到没有预料的情况阻止其完成请求,因此服务端断开连接。
- 1012:服务端由于重启而断开连接。
- 1013:服务端由于临时原因断开连接,如服务器过载因此断开一部分客户端连接。
- 1015:保留,表示连接由于无法完成 TLS 握手而关闭(例如无法验证服务器证书)。
这些状态码允许开发者了解 WebSocket 连接为何被关闭,从而可以采取适当的错误处理措施。在实际应用中,开发者可以根据需要选择合适的状态码来关闭 STOMP 连接。
错误重连的处理
-
记录重连次数:通过 reconnectAttempts 属性记录当前已经尝试重连的次数。
-
设置最大重连次数:通过 maxReconnectAttempts 属性设置允许的最大重连次数。
-
重连逻辑:在 onclose 和 onerror 事件中调用重连处理函数 handleReconnect。
-
重连间隔:通过 reconnectInterval 属性设置每次重连的间隔时间,可以在每次重连时增加间隔以实现指数退避。
private handleReconnect(): void {
if (this.reconnectAttempts < this.maxReconnectAttempts) {
this.reconnectAttempts++;
console.log(`尝试重连... (${this.reconnectAttempts}/${this.maxReconnectAttempts})`);
setTimeout(() => {
this.connect();
}, this.reconnectInterval * this.reconnectAttempts); // 重连间隔可以增加,例如指数退避
} else {
console.log(`最大重连失败,终止重连: ${this.url}`);
}
}
stomp = null
if (close?.code == 0)
return@setOnDisconnected
else if (reConnect) {
init(userId, workMobile, messageNotify)// 尝试重新连接
}