【发布时间】:2021-07-06 00:42:32
【问题描述】:
我找到了这个答案Connect NestJS to a websocket server
实现了我的客户,就像您在第一个答案中所拥有的那样。第二个答案在我头上发泄了一下。现在我遇到了听众的问题。当套接字断开连接时,我想重新连接。正如您在示例中所见,侦听器在构造函数中被实例化。当我想重新连接时,这些听众没有重新实例化,我不知道如何实现。 或者如何以其他方式实例化侦听器?或者甚至如何销毁该服务并建立一个新服务?
【问题讨论】:
我找到了这个答案Connect NestJS to a websocket server
实现了我的客户,就像您在第一个答案中所拥有的那样。第二个答案在我头上发泄了一下。现在我遇到了听众的问题。当套接字断开连接时,我想重新连接。正如您在示例中所见,侦听器在构造函数中被实例化。当我想重新连接时,这些听众没有重新实例化,我不知道如何实现。 或者如何以其他方式实例化侦听器?或者甚至如何销毁该服务并建立一个新服务?
【问题讨论】:
所以,你使用 websocket (lib "ws")。 你可以重写你的服务
// socket-client.ts
import { Injectable } from "@nestjs/common";
import * as WebSocket from "ws";
import {timer} from 'rxjs'
@Injectable()
export class WSService {
// wss://echo.websocket.org is a test websocket server
private ws: WebSocket;
private isConnect = false;
constructor() {
this.connect()
}
connect(){
this.ws = new WebSocket("wss://echo.websocket.org");
this.ws.on("open", () => {
this.isConnect = true;
this.ws.send(Math.random())
});
this.ws.on("error", (message) => {
this.ws.close()
this.isConnect = false;
});
this.ws.on("close", (message) => {
timer(1000).subscribe(() => {
this.isConnect = false;
this.connect();
})
});
this.ws.on("message", (message) => {
//handler
});
}
send(data: any) {
this.ws.send(data);
}
getIsConnect(){
return this.isConnect;
}
}
您使用函数 connect() 来创建新连接。并且当连接错误时,你关闭它,当关闭连接时,你会触发定时器等待1s然后重新连接。
这是用ws实现reconnect的最简单的方法,但实际上有很多原因导致socket断开,或者服务器忘记你。您必须执行 ping-pong 以确保服务器不会忘记您,或者间隔检查 isConnect 然后重新连接
或者您可以使用 socket-io.client,因为它会自动为您处理重新连接。但是也需要服务器实现socket-io。
您可以在https://*.com/a/23176223/4397117阅读更多内容
【讨论】: