2015-01-09 1 views
5

Sto semplicemente facendo disconnettere i miei server che non inviano dati dopo un certo periodo di tempo, come 20 secondi.Scollegamento della presa dopo un certo periodo di tempo in cui nessun dato è stato ricetrasmesso

Mi chiedo se lavorare con i timer sia un bene o ci sia qualcosa di speciale nella libreria di socket? Lavorare con i timer sul server per ogni socket lo rende pesante.

È pericoloso farlo gestire dal programma client? Ad esempio, ogni client si disconnette dopo non aver inviato dati per un po '.

+0

Che dire di un timer che controlla periodicamente tutti i client attivi. È necessario aggiornare l'ultimo tempo di ricezione per client, quando i dati vengono ricevuti e garantire una sincronizzazione corretta. –

+0

@AlexFarber forse. ttl funziona per questo? come posso usarlo per questo? – virtouso

+0

@AlexFarber per favore inviami il tuo codice di esempio. grazie – virtouso

risposta

2

Questo dovrebbe essere molto facile da implementare come parte del controllo keep-alive. A meno che tu non stia ignorando completamente il problema delle connessioni interrotte, probabilmente hai un sistema keep-alive che invia periodicamente un messaggio client-> server e viceversa se non c'è stata comunicazione. Dovrebbe essere banale aggiungere un semplice valore "ultimo tempo di ricezione dati" allo stato del socket, quindi chiudere il socket se si allontana troppo da DateTime.Now.

Ma la domanda più importante è "Perché?". La soluzione migliore dipende da quali sono le tue ragioni in primo luogo. Vuoi rendere il server utilizzabile per più clienti scaricando quelli che non inviano dati? Probabilmente peggiorerai tutto, dal momento che i timeout per i socket TCP sono più di 2-4 minuti, quindi quando si disconnette il client dopo 20 secondi e si ricollega, ora utilizzerà due porte sul lato server, anziché una. Ops.

Come per il commento sulla risposta cancellata, and connection without data send and receive i think it gonna waste your threads punti più vicini al tuo vero problema: la quantità di connessione che il tuo server non dovrebbe avere alcuna relazione con il numero di thread che il server usa per servire quelle connessioni. Quindi l'unica cosa che una connessione aperta potrebbe "sprecare" è fondamentalmente un po 'di memoria (a seconda della quantità di memoria necessaria per la connessione, più il costo del socket con i suoi buffer) e una porta TCP. Questo può essere un problema in alcune applicazioni, ma se arrivi mai a quel livello di "caricamento", probabilmente puoi già congratularti con te stesso. Molto più probabilmente finirai con altre risorse prima di avvicinarti ai limiti delle porte (supposizione basata sul fatto che sembra che stai realizzando un gioco MMO). Se ti imbatti davvero in problemi con questi, probabilmente vuoi rilasciare TCP e riscrivere tutto in UDP (o preferibilmente, una soluzione pronta su UDP).

+0

Grazie Luaan. Sareste più dettagliati in un 'sistema keep-alive che invia periodicamente un messaggio client-> server e viceversa se non c'è stata comunicazione? ... Intendete trasmettere ad un gruppo di client vivi a intervalli specifici?Se questo è ciò che intendi, possiamo considerarlo un buon modo per aggirare gli utenti online di ~ 20K? – revo

+1

@revo Sì, certo. Ovviamente, avere 20k utenti online su un singolo server ha già bisogno di alcune configurazioni di rete (soprattutto, aumentando il numero di porte effimere sul server), quindi potrebbe essere una buona idea esaminare i requisiti e capire se TCP è un buona idea dopotutto. Una bella libreria di rete su UDP (ad esempio Lindgren) potrebbe essere più in linea con le tue esigenze. – Luaan

0

Il modello Client-Server descrive come un client deve connettersi a un server ed eseguire richieste. Quello che ti consiglierei sarebbe di connettersi al server, e quando finisci di recuperare tutta la data che ti serve, chiudi il socket (sul lato client).

Il server alla fine troverà le risorse del socket rilasciate, ma è possibile verificare la proprietà Connected del socket per rilasciare le risorse prima.

+0

È un gioco online quindi non esiste una definizione di "tutti i dati". La connessione è costantemente attiva finché l'utente non si disconnette manualmente. – revo

0

Quando il client si disconnette dal server, il server può ottenere un evento di disconnessione. sembrare

socket.on('disconnect', function() { 
// Disconnect event handling 

}); 

Sul lato client è inoltre findout evento di disconnessione .. in cui è necessario ricollegare il server.