websocket - 如何防止websocket在angular5中的特定时间后关闭?

标签 websocket rxjs angular5

我正在使用 'rxjs-websockets' 与 websockets 连接。但经过一定时间(约 2 分钟)
连接被关闭。如何保持连接直到手动关闭。

这是我使用的代码片段

constructor(private socketService: WebSocketService) {}

this.socketService.connect('/endpoint');
this.socketSubscription = this.socketService.messages
      .subscribe(result => {            
            // perform operation
    });

这是 WebSocketService
import {Injectable} from '@angular/core';
import {QueueingSubject} from 'queueing-subject';
import {Observable} from 'rxjs/Observable';
import websocketConnect from 'rxjs-websockets';
import 'rxjs/add/operator/share';
import 'rxjs/add/operator/retryWhen';
import 'rxjs/add/operator/delay';

@Injectable()
export class WebSocketService {
  private inputStream: QueueingSubject<string>;
  public messages: Observable<string>;

  constructor() {    
  }

  public connect(socketUrl) {
      this.messages = websocketConnect(
        socketUrl,
        this.inputStream = new QueueingSubject<string>()
      ).messages.retryWhen(errors => errors.delay(1000))
        .map(message => JSON.parse(message))
        .share();
  }

  public send(message: string): void {
    this.inputStream.next(message);
  }
}

最佳答案

Websockets 通常在一些消息交换的帮助下保持连接很长一段时间。
在我们的例子中,我们可以将其称为“ping => pong”,客户端发送消息“ping”,服务器可能会以消息“pong”作为响应。

您可以按如下方式每 30 秒发送一次 ping。

setInterval(() => {
    this.socketService.send('ping');
}, 30000);

当您将 WebSocketService 收到的每条消息都转换为 JSON 时,您必须进行这些更改
避免 JSON 解析错误。
export class WebSocketService {
.
.
.

    public connect(socketUrl) {
      this.messages = websocketConnect(
        socketUrl,
        this.inputStream = new QueueingSubject<string>()
      ).messages.retryWhen(errors => errors.delay(1000))
        //parse messages except pong to avoid JSON parsing error
        .map(message => message === 'pong' ? message : JSON.parse(message))
        .share();
    }
.
.
.
}

关于websocket - 如何防止websocket在angular5中的特定时间后关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49293540/

相关文章:

node.js - 在 Intellij IDEA 中使用 standard.js 进行 Linting

Angular 5 - 未捕获的 ReferenceError : req is not defined

angular-material - Angular 2 Material 水平滚动数据表边框问题

javascript - 扩展如何监听 WebSocket? (如果 WebSocket 在 iframe 中怎么办?)

javascript - PubNub 退订会减慢整个 Web 应用程序的速度

javascript - 如何在 iOS 应用程序中通过 websockets 实现和通信?

javascript - 如何通过 RxJS 6 制作 SR Latch?

jsf - <f :websocket> Tag Library supports namespace: http://xmlns. jcp.org/jsf/core,但没有为名称定义标签:websocket

javascript - 如何使用 Angular4 中的 Observables 从后端 API 检索分页 HTTP 请求

RxJS 管道 Finalize 运算符未被调用