【问题标题】:NestJS websocket client message listenerNestJS websocket 客户端消息监听器
【发布时间】:2021-07-06 00:42:32
【问题描述】:

我找到了这个答案Connect NestJS to a websocket server

实现了我的客户,就像您在第一个答案中所拥有的那样。第二个答案在我头上发泄了一下。现在我遇到了听众的问题。当套接字断开连接时,我想重新连接。正如您在示例中所见,侦听器在构造函数中被实例化。当我想重新连接时,这些听众没有重新实例化,我不知道如何实现。 或者如何以其他方式实例化侦听器?或者甚至如何销毁该服务并建立一个新服务?

【问题讨论】:

    标签: websocket nestjs


    【解决方案1】:

    所以,你使用 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阅读更多内容

    【讨论】: