Molti piccoli pacchetti vanno bene. In effetti, se sei preoccupato per l'overhead TCP, inserisci abufferstream
che raccoglie fino a 1500 caratteri (o qualunque sia il tuo MTU TCP, meglio richiederlo dinamicamente), e affronta il problema in un unico posto. In questo modo risparmi il sovraccarico di ~ 40 byte per ogni pacchetto aggiuntivo che altrimenti avresti creato.
Detto questo, è ancora meglio inviare meno dati e creare oggetti più grandi aiuta lì. Ovviamente è più piccolo inviare "UID:10|1|2|3
che inviare UID:10;x:1UID:10;y:2UID:10;z:3
. In effetti, anche a questo punto non dovresti reinventare la ruota, usa una libreria come protobuf che può ridurre tali dati a una stringa di 10 byte o meno.
L'unica cosa che non dovresti dimenticare è inserire un Flush
comando sul tuo stream in posizioni pertinenti, perché non appena smetti di aggiungere dati al tuo stream, potrebbe aspettare infinito prima di inviare qualcosa. Davvero problematico quando il tuo client è in attesa di quei dati e il tuo server non invierà nulla di nuovo fino a quando il client non invierà il comando successivo.
La perdita del pacchetto è qualcosa che puoi influenzare qui, marginalmente. Ogni byte inviato può essere potenzialmente danneggiato e TCP richiederà automaticamente una ritrasmissione. Pacchetti più piccoli significano una minore possibilità di corruzione per ogni singolo pacchetto, ma poiché si sommano sull'overhead, si inviano ancora più byte, aumentando ulteriormente le probabilità di un pacchetto perso. Quando un pacchetto viene perso, TCP memorizzerà in buffer tutti i dati successivi fino a quando il pacchetto mancante viene rinviato e ricevuto. Ciò comporta un grande ritardo (ping). Mentre la perdita totale della larghezza di banda a causa della perdita del pacchetto potrebbe essere trascurabile, il ping più elevato sarebbe indesiderabile per i giochi.
Conclusione: inviare il minor numero possibile di dati, inviare pacchetti di grandi dimensioni e non scrivere i propri metodi di basso livello per farlo, ma fare affidamento su librerie e metodi noti come bufferstream
e protobuf per gestire il sollevamento di carichi pesanti.