Android websock、stomp、sockjs

218 阅读5分钟

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.

blog.csdn.net/cw_hello1/a…

websocket 常见错误码

在 STOMP 协议中,关闭(close)操作通常涉及到 WebSocket 的关闭状态码。根据 WebSocket 规范,当关闭一个连接时,可以指定一个状态码和可选的原因字符串来解释关闭的原因。如果关闭帧中没有包含状态码,默认状态码为1005,表示没有收到预期的状态码。

WebSocket 定义了一组标准的状态码,用于表示关闭的原因,以下是一些常见的状态码:

  1. 1000:正常关闭,意味着连接建立的目标已经完成了。
  2. 1001:终端离开,可能因为服务端错误,也可能因为浏览器正从打开连接的页面跳转离开。
  3. 1002:由于协议错误而中断连接。
  4. 1003:由于接收到不允许的数据类型而断开连接(如仅接收文本数据的终端接收到了二进制数据)。
  5. 1004:保留,其意义可能会在未来定义。
  6. 1005:保留,表示没有收到预期的状态码。
  7. 1006:用于期望收到状态码时连接非正常关闭(也就是说,没有发送关闭帧)。
  8. 1007:由于收到了格式不符的数据而断开连接(如文本消息中包含了非 UTF-8 数据)。
  9. 1008:由于收到不符合约定的数据而断开连接。
  10. 1009:由于收到过大的数据帧而断开连接。
  11. 1010:客户端期望服务器商定一个或多个拓展,但服务器没有处理,因此客户端断开连接。
  12. 1011:客户端由于遇到没有预料的情况阻止其完成请求,因此服务端断开连接。
  13. 1012:服务端由于重启而断开连接。
  14. 1013:服务端由于临时原因断开连接,如服务器过载因此断开一部分客户端连接。
  15. 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)// 尝试重新连接
}