Отключение сокета с таймаутом пинга и закрытие транспорта при нескольких соединениях - PullRequest
0 голосов
/ 04 июля 2018

Мы работаем со средним стеком, угловым 4 и экспрессом, В серверной стороне используется socket.io и во внешнем интерфейсе используется ng-socket-io Код внешнего интерфейса

import { Injectable } from '@angular/core';
import { Socket, SocketIoModule } from 'ng-socket-io';
import 'rxjs/add/operator/map';

export interface Message {
    author: string,
    message: string
}

@Injectable()
export class SocketService {
    constructor( private mysocket : Socket ) {}

    trigger(name,content){
        this.mysocket.emit(name,content);
    }

    getFromEvent() {
      return this.mysocket
          .fromEvent<any>('chatRes')
          .map( data => data );
    }

    insertActive() {
      return this.mysocket
          .fromEvent<any>('insertActive')
          .map( data => data );
    }

    insertStop() {
      return this.mysocket
          .fromEvent<any>('insertStop')
          .map( data => data );
    }

    liveOrderAdd() {
      return this.mysocket
          .fromEvent<any>('liveOrderAdd')
          .map( data => data );
    }

    orderRemoved() {
      return this.mysocket
          .fromEvent<any>('orderRemoved')
          .map( data => data );
    }

    updateLiveOrders() {
      return this.mysocket
          .fromEvent<any>('updateLiveOrders')
          .map( data => data );
    }

    updateActiveOrder() {
      return this.mysocket
          .fromEvent<any>('updateActiveOrder')
          .map( data => data );
    }

    tradeRates() {
      return this.mysocket
          .fromEvent<any>('tradeRates')
          .map( data => data );
    }

    updateStopOrder() {
      return this.mysocket
          .fromEvent<any>('updateStopOrder')
          .map( data => data );
    }

    updateHistory() {
      return this.mysocket
          .fromEvent<any>('updateHistory')
          .map( data => data );
    }

}

Код сервера

var socketio = require('socket.io');
var chatDb = require('../model/chat.js');
var users = [];
var connections = [];
module.exports.listen = function(app){
  io = socketio.listen(app)
  io.on('connection', function(socket){
    connections.push(socket);

    //Disconnect
    socket.on('disconnect', function(data){
      console.log(data);
      users.splice(users.indexOf(socket.username), 1);
      //updateUsernames();
      connections.splice(connections.indexOf(socket), 1);

      socket.disconnect();
    });

    socket.on('chatMsg',function(det){
      if(det.name && det.message) {
        chatDb.create(det,function(err,resData){
          if(err === null) {
            io.sockets.emit('chatRes',det)
          }
        })
      }
    });

    socket.on('addUser',function(user){
      if(user) {
        users.push(user);
        socket.join(user)
      }
      console.log(users);
    });

    socket.on('connectuser',function(user){
      console.log(user,'testing user');
    });
  });
  return io;
}

Нам нужно отправить ответ со стороны сервера и получить его со стороны клиента, это важный процесс в нашем приложении

Работает нормально для 1 или 2 подключения (пользователи)

но для номера пользователя он отключается постоянно

с ошибкой таймаута пинга

когда мы ищем в переполнении стека, кто-то сказал, что нужно поместить pingTimeout и pingInterval, но возникает та же проблема

var io = require('./server/helpers/socket').listen(server,{'pingInterval': 100000, 'pingTimeout': 600000})

мы изо всех сил здесь кто-нибудь помочь за это ценится

В ожидании ценного ответа Заранее спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...