Websocket实现心跳

本文介绍了如何在Angular应用中实现WebSocket心跳机制,包括在service层的实现和在component组件中如何调用这部分功能。

Angular的实现,分成service部分,以及调用该service的component。

service代码 websocket.service.ts

import {Injectable} from '@angular/core';

@Injectable({
  providedIn: 'root'
})
export class WebSocketService {

  constructor() {
  }

  createWebSocket(url: string, ws, reconnectLock, messageHandler) {
    if (url.startsWith("/")) {
      if (window.location.protocol === "https:") {
        url = "wss://" + window.location.host + url;
      } else {
        url = "ws://" + window.location.host + url;
      }
    }

    ws = new WebSocket(url);
    this.initWebSocket(url, ws, reconnectLock, messageHandler);
  }

  private initWebSocket(url, ws, reconnectLock, messageHandler) {
    ws.onopen = (event) => {
      console.log("WebSocket onopent");
      ws.send("Heart beat message.");
      this.heartBeatCheck.start(ws);
    }

    ws.onmessage = (event) => {
      console.log("WebSocket onmessage");
      messageHandler.onMessage(event);
      this.heartBeatCheck.start(ws);
    }

    ws.onclose = (event) => {
      console.log("WebSocket onclose");
      this.reconnect(url, ws, reconnectLock, messageHandler);
    }

    ws.onerror = (event) => {
      console.log("WebSocket onerror");
      this.reconnect(url, ws, reconnectLock, messageHandler);
    }
  }

  private reconnect(url, ws, reconnectLock, messageHandler) {
    if (reconnectLock.lock) {
      return;
    }

    reconnectLock.lock = true;

    let self = this;
    setTimeout(function () {
      self.createWebSocket(url, ws, reconnectLock, messageHandler);
      reconnectLock.lock = false;
    }, 30000);
  }

  private heartBeatCheck = {
    heartBeatTimeout: 30000,
    heartBeatObj: null,
    serverResponseTimeout: 10000,
    serverResponseObj: null,
    start: function (ws) {
      let self = this;
      self.heartBeatObj && clearTimeout(self.heartBeatObj);
      self.serverResponseObj && clearTimeout(self.serverResponseObj);

      self.heartBeatObj = setTimeout(function () {
        ws.send("Heart beat message.");

        self.serverResponseObj = setTimeout(function () {
          ws.close();
        }, self.serverResponseTimeout);
      }, self.heartBeatTimeout);
    }
  }
}

conponent代码 dashboard.component.ts

import {Component, OnInit} from '@angular/core';

import {MonitorService} from "../../services/monitor.service";
import {AppEditType} from "../app-edit/app-edit-type";
import {WebSocketService} from "../../services/websocket.service";
import {environment} from "../../../environments/environment";
import {MonitoredApplication} from "../../entities/monitored-application";

@Component({
  selector: 'app-dashboard',
  templateUrl: './dashboard.component.html',
  styleUrls: ['./dashboard.component.css']
})
export class DashboardComponent implements OnInit {

  appEditTypes = AppEditType;
  wsUrl = environment.wsUrl;
  webSocket = null;
  reconnectLock = {lock: false};

  constructor(private monitorService: MonitorService,
              private webSocketService: WebSocketService) {
  }

  ngOnInit() {
    this.webSocketService.createWebSocket(this.wsUrl, this.webSocket, this.reconnectLock, this.messageHandler);
  }

  private messageHandler = {
    context: {
      service: this.monitorService
    },
    onMessage : function(event){
      if (event.data == "HeartBeatOK") return;

      let apps = JSON.parse(event.data) as Array<MonitoredApplication>;
      this.context.service.refreshAllApplications(apps);
    }
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值