socket-client+stomp.js总结

1.前端在websocket连接后端时,没有带token,后端报错并写入日志,前后端无法连接时,前端不断的发请求试图去连接,后端不断写日志,然后后端日志撑爆了。

原因:连接关闭后xhr_streaming无限循环。根据sockjs-client的说明,如果客户端采用websocket连接不上服务器,它可以回退选择其他传输方案比如xhr_streaming等等

解决一:在sockjs-client上GitHub的issue上面看到了解决方法

      let sock = new SockJS(httpaddres);
      var _transportClose = sock._transportClose;
      sock._transportClose = function(code, reason) {
      if (this._transport && this._transport.close) {
         this._transport.close();
      }
     _transportClose.call(this, code, reason);
     }

我看到这已在master中修复,但在1.1.4中没有。我用的就是1.1.4
解决二:配置option中的transports。

new SockJS('http://arcs.dev.nicai.com', null, {transports:['websocket']})

transports:此选项允许您提供可由SockJS使用的列表传输。默认情况下,所有可用的传输都将被使用,但有时需要禁用一些回退传输是有用的。

2.服务器连接不上,重连机制
项目采用的方案是采用试图连接10次,每次间隔时间逐渐延长的机制进行重连
代码示例

    getnewjq(count) {
      let num=count||1;
      let httpaddres = policeApi.sockpoliceAddress;
      let sock = new SockJS(httpaddres);
      this.stomp = Stomp.over(sock);
      this.stomp.connect(
        "guest",
        "guest",
        frame => {
          this.stomp.subscribe(
            "/user/topic/pd_warning_newest/",
            this.refreshjq
          );
        },
        error => {
          if (num < 10) {
            setTimeout(() => {
              this.getnewjq(num + 1);
            }, 10000 * num);
          } else {
            console.log("放弃重连了");
          }
        }
      );
    },

      });
    },

3.stomp心跳机制
stomp默认的心跳为10000ms,
heartbeat.outgoing:客户端发给服务端的心跳,* 0表示它不能发送心跳 * 否则它是能保证两次心跳的最小毫秒数
heartbeat.incoming:客户端希望服务端发送的心跳。* 0表示它不想接收心跳 * 否则它表示两次心跳期望的毫秒数
CONNECT
heart-beat:, 客户端

CONNECTED:
heart-beat:, 服务端
对于client发送server的心跳: * 如果为0(client不能发送心跳)或者为0(server不想接收心跳),将不起任何作用。心跳频率为MAX(,)毫秒数.
对于server发送client的心跳:心跳频率为MAX(,)毫秒数.

你可能感兴趣的:(socket-client+stomp.js总结)