2013-09-08 19 views
6

Ho bisogno di implementare client/server di messaggistica istantanea usando socket puri in Java lang.
Il server deve servire un numero elevato di client e devo decidere quali socket utilizzare: TCP o UDP.
Grazie, Costa.Cosa è meglio per l'instant messenger TCP o UDP?

+0

Dipende da cosa si richiede gli uirements sono.L'unico requisito che ci hai fornito, un "gran numero di clienti" è fondamentalmente privo di significato perché non sappiamo se consideri 800 clienti un "numero elevato" o 16.000. –

+0

Possono essere decine di migliaia di client nello stesso tempo – Wizit

risposta

7

TCP

Motivo:

TCP: "C'è assoluta garanzia che i dati trasferiti rimane intatto e arriva nello stesso ordine in cui è stato trasmesso"

UDP: "Non c'è alcuna garanzia che i messaggi o i pacchetti inviati vengano raggiunti".

Ulteriori informazioni presso: http://www.diffen.com/difference/TCP_vs_UDP

vorreste il vostro messaggio di chat forse perduto?

Modifica: Ho perso la parte relativa al "programma di chat di grandi dimensioni". Penso che a causa della natura del programma di chat debba essere un server TCP, non riesco a immaginare il contenuto testuale effettivamente inviato dagli utenti su un protocollo UDP.

Il limite massimo per i server TCP è 65536 connessioni allo stesso tempo. Se si ha realmente bisogno di superare quel numero, è possibile creare un server del dispatcher che invii le connessioni in entrata al server appropriato in base ai carichi del server corrente.

+0

In realtà non voglio che il messaggio vada perso, ma c'è un limite di socket che il server può creare? Come ho capito TCP apre il socket per ogni client TCP connesso. – Wizit

+0

Non mi preoccuperei delle limitazioni di carico sul server, a meno che non pianifichi di implementare un programma di chat ridicolmente grande. Il limite massimo su un server TCP è 65536 connessioni. E sì, devi avere una connessione aperta per ogni cliente. –

1

Dipende se l'utente deve sapere se i messaggi sono stati consegnati al server. I pacchetti UDP non hanno alcun riconoscimento intrinseco. Se il client invia un messaggio IM al server e si perde durante il transito, né il client né il server ne saranno a conoscenza.

(La risposta breve è "uso TCP" ... ma vale la pena di pensare attraverso le implicazioni di progettazione per te stesso.)

1

TCP darebbe l'affidabilità, il che è certamente auspicabile quando, durante la messaggistica istantanea - si non vorrebbe che i messaggi vengano eliminati durante la conversazione.

Tuttavia, se si intende utilizzare la messaggistica di gruppo, è possibile che si finisca per utilizzare il mulitcast. Per tali casi, UDP sarebbe la scelta giusta dal momento che UDP può gestire point to multipoint. L'utilizzo del protocollo TCP per le applicazioni multicast sarebbe difficile poiché ora il mittente dovrebbe tenere traccia delle ritrasmissioni/della frequenza di invio per più ricevitori. Un'alternativa potrebbe essere utilizzare il protocollo TCP per la chat point-to-point e utilizzare UDP per la messaggistica di gruppo.

4

È possibile utilizzare entrambi. Usa TCP per scambiare i messaggi effettivi, (quindi nessun dato perso e lo streaming di messaggi di grandi dimensioni, (ad esempio contenente jpegs ecc.) È possibile.Usare UDP solo per inviare brevi messaggi 'connectNow' ai client per i quali ci sono messaggi in coda. potrebbe avere stati come (NotLoggedIn, TCPconnected, TCPdisconnected, LoggedOut) con vari timeout per controllare le transizioni di stato e i normali eventi di scambio di messaggi.Il messaggio 'connectNow' dell'UDP istruirà i client in 'TCPdisconnected' per connettersi e quindi passare a 'TCPconnected', dove rimarrebbero, scambiando messaggi, fino a quando un timer di inattività richiede al client di disconnettersi per ora.Questo sarebbe, ovviamente, inaffidabile e quindi potresti voler ripetere il messaggio 'connectNow' ogni X secondi per N volte il client deve, in ogni caso, tentare un sondaggio ogni X minuti, nel caso in cui ...

Problemi correlati