NestJS websocket客户端消息侦听器

NestJS websocket客户端消息侦听器,websocket,nestjs,Websocket,Nestjs,我找到了这个答案 按照您在第一个答案中的方式实现我的客户机。第二个答案在我头上有一点。现在我对听众有一个问题。当插座断开时,我想再次重新连接。正如您在示例中所看到的,侦听器是在构造函数中实例化的。当我想重新连接时,这些侦听器不会被重新实例化,我不知道如何实现这一点。 或者如何以其他方式实例化侦听器?或者甚至如何销毁该服务并构建一个新的服务?因此,您使用websocket(lib“ws”)。 你可以重写你的服务 // socket-client.ts import { Injectable } f

我找到了这个答案

按照您在第一个答案中的方式实现我的客户机。第二个答案在我头上有一点。现在我对听众有一个问题。当插座断开时,我想再次重新连接。正如您在示例中所看到的,侦听器是在构造函数中实例化的。当我想重新连接时,这些侦听器不会被重新实例化,我不知道如何实现这一点。 或者如何以其他方式实例化侦听器?或者甚至如何销毁该服务并构建一个新的服务?

因此,您使用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重新连接的最简单方法,但事实上,有很多原因会导致套接字断开连接,或者服务器忘记您。您必须实现乒乓,以确保服务器不会忘记您,或者间隔检查断开连接,然后重新连接

或者您可以使用socket-io.client,因为它可以为您自动处理重新连接。但也需要服务器实现套接字io

你可以在网上阅读更多