Socket.io испускает несколько раз клиенту - PullRequest
1 голос
/ 02 мая 2020

В основном мы используем сокет для вызова поставщиков для приложения, созданного во флаттере, в той части приложения, в которой мы работали с сокетом в службе переднего плана, однако при потере соединения inte rnet сокет накапливает выбросы и в итоге происходит сбой приложения, вызывающий утечку памяти.

У меня нет идей, чтобы исправить это сейчас.

На стороне сервера

global.ioDeliveryman = require('./socketio.js').init(deliveryManServer, {
        pingInterval: 10,
        pingTimeout: 5,
    });

global.ioDeliveryman.on('connect', function (socket) {
        socket.on('USER_CONNECTED', function(data){
            global.connectedDeliverymanUsers[data.id] = {socket_id: socket.conn.id , aceite: data.aceite}
        });

        socket.on('USER_DISCONNECTED', function(data){
            if(global.connectedDeliverymanUsers[data.id]){
                try {
                    global.ioDeliveryman.sockets.connected[global.connectedDeliverymanUsers[data.id].socket_id].disconnect();
                    delete global.connectedDeliverymanUsers[data.id]
                } catch (TypeError) {
                    console.log("Disconnect of undefined");
                }
            }
        });
    }); 

На стороне клиента

   if (!socket.connected) {
        conectar();

        var jsao;
        socket.on(describeEnum(SocketFunction.ALOCAR_ENTREGADOR), (data) async => {
          socket.emit(describeEnum(SocketFunction.PONG), { "id": userId } ),

          Vibration.vibrate(pattern: [1, 1000, 500, 2000]),

         //the var jsao is setted here

          NotificationUtils.showNotificationNovaCorrida(jsao),
          await FGS.ForegroundService.sendToPort(jsao),

          // check if app it's in the background aind wait 45 seconds to 
          Timer(Duration(seconds: 43), () async {
            await FGS.ForegroundService.sendToPort('{"order": {"funcao": "VERIFICAR_BACKGROUND"}}');
            if (isBackground) {
              Timer(Duration(seconds: 2), () {
                enviarAceiteEntregador(false, "${data["order"]["user_id"]}");
              });
            }
            isBackground = true;
          }),
        });

Излучение внутри функции обратного вызова на бэкэнде

здесь мы выполняем пинг-понг, чтобы увидеть, подключен ли пользователь, но иногда происходит утечка памяти, что происходит в al oop с обратным вызовом. циклически перебирать доступных поставщиков, пока один из них не примет

    // PING
        try{
            if (alertMap.get(entregador.deliveryman_id.toString())) {
                callback();
                return;
            }
           //emit for deliveryman with socketId
            global.ioDeliveryman.to(socketId).emit('ALOCAR_ENTREGADOR', {order: actualOrder, clientName: clientName});
        } catch (TypeError) { console.log("Disconnect of undefined"); }

        // PONG
        pongMap.set(entregador.deliveryman_id.toString(), false);

, все работает до того момента, пока доставщик не потеряет соединение, тогда сокет начинает безумно излучать

...