2011-09-07 20 views
11

Stavo considerando di fare un server di chat usando node.js/socket.io. Dovrei renderlo un server TCP o un server http? Immagino che il server tcp sarebbe più efficiente, ma puoi inviarci altre cose come allegati di file, ecc? Se tcp è più efficiente, quanto più? Inoltre, ti chiedi quante connessioni simultanee possono gestire un server node.js? È più lavoro fare TCP o HTTP?Discussione: Chat server via node.js: HTTP o TCP?

risposta

25

si sta parlando di 2 approcci totalmente diversi qui - TCP è un protocollo di livello di trasporto e HTTP è un protocollo di livello applicativo. HTTP (di solito) opera su TCP, quindi qualunque opzione scegliate, funzionerà comunque su TCP.

La domanda di efficienza è una specie di punto controverso, perché si parla di diversi OSI layers. Se hai scelto socket TCP non elaborati, la tua soluzione sarebbe probabilmente più efficiente, almeno nella larghezza di banda, dal momento che HTTP contiene una serie di dati aggiuntivi (le intestazioni) che probabilmente non sarebbero pertinenti ai tuoi scopi (a seconda della scala della chat programma). Quello di cui stai parlando è lo sviluppo del tuo protocollo di applicazione.

È possibile inviare qualcosa che ti piace su TCP - dopo tutto HTTP può inviare gli allegati, e che opera su TCP. FTP funziona anche su TCP, ed è progettato esclusivamente per il trasferimento di "allegati". Per fare ciò, è necessario scrivere il protocollo in modo che fosse in grado di comunicare alla parte remota che i seguenti dati erano un file, quindi inviare i dati del file, quindi comunicare alla parte remota che il trasferimento è completo. Le implementazioni di questo sono molte e varie (l'approccio HTTP è completamente diverso dall'approccio FTP) e le tue opzioni sono praticamente infinite.

Non so per certo sul limite di connessione node.js, ma posso dire con una certa sicurezza che è limitato dal sistema operativo. This potrebbe aiutarti a comprendere la risposta a questa domanda.

È discutibile se sia più lavoro farlo con TCP o HTTP - è molto lavoro da fare in entrambi. Probabilmente mi sposterò di più verso l'opzione TCP che è la soluzione migliore. Mentre TCP richiede di progettare un protocollo piuttosto che/oltre a un'applicazione, HTTP non è particolarmente adatto per applicazioni live a 2 vie come i server di chat. Ci sono molte implementazioni di chat su HTTP che usano AJAX, ma posso dirti dall'esperienza dolorosa che sono un dolore completo nella parte posteriore.

Direi che si dovrebbe guardare solo HTTP se si intende che l'endpoint (ovvero il client) sia un browser. Se si sta per scrivere un'app desktop per l'endpoint, un collegamento TCP diretto sarebbe sicuramente la strada da percorrere. Il motivo principale per questo è che HTTP funziona in modalità richiesta-risposta, dove il client invia una richiesta al server e il server risponde. Su TCP è possibile aprire un singolo flusso TCP, che può essere utilizzato per la comunicazione bidirezionale. Ciò significa che il server può inviare istantaneamente un evento al client, mentre su HTTP è necessario attendere che il client invii una richiesta, in modo che tu possa rispondere con un evento. Se si intendesse utilizzare un browser come client, renderebbe l'intera operazione di trasferimento di file molto più complicata (l'invio almeno).

Ci sono modi per implementare questo tramite HTTP utilizzando polling lungo e server push (read this) ma può essere un vero problema da implementare.

Se si intende implementarlo su una LAN (o anche su Internet) vale la pena considerare UDP su TCP - in un'applicazione di chat non è in genere assolutamente mission-critical che i messaggi arrivino nell'ordine corretto, e anche se lo fosse, probabilmente gli utenti non sarebbero in grado di digitare più velocemente delle variazioni della latenza di rete (probabilmente < 100 ms). Quindi per i trasferimenti di file è possibile negoziare un socket TCP separato per lo scambio di dati (come FTP) o implementare una sorta di sistema UDP ACK (come TFTP).

Ritengo che ci sia molto altro da dire su questo argomento ma al momento non riesco a dirlo in parole - potrei estendere questa risposta ad un certo punto.

+0

avete qualche idea su come fare tcp con il lato client node.js/socket.io? Ho questa domanda elencata anche qui: http://stackoverflow.com/questions/7340475/client-side-tcp-with-node-js-socket-io – Derek

+0

btw. grazie per aver spiegato molto sta aiutando molto Tuttavia, puoi spiegare di più su udp e i suoi vantaggi/svantaggi rispetto a tcp? grazie mille! – Derek

+0

la perdita di pacchetti udp influisce su un'app di chat? – Derek

2

I server di chat sono il programma Hello World nel nodo. Usa http.

Per quanto riguarda il numero di connessioni concorrenti che può gestire, tutto dipende dal sistema. Configura un semplice server di chat e poi prova a confrontarlo.

Inoltre, controlla http://search.npmjs.org/ e cerca chat per alcuni suggerimenti.