NestJS websocket 客户端消息监听器

NestJS websocket client message listener

我找到了这个答案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() 创建新连接。当连接错误时,你关闭它,当关闭连接时,你会触发定时器等待1秒然后重新连接。

这是最简单的ws重连方式,但实际上导致socket断开连接,或者服务器忘记你的原因有很多。您必须实施乒乓以确保服务器不会忘记您,或者间隔检查 isConnect 然后重新连接

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

您可以在

中阅读更多内容