Genau darum muss sich dein Protokoll kümmern. Die Socket Komponenten übertragen einfach nur die Daten. Sie sorgen für die richtige Reihenfolge der Bytes. Wie und in welcher Teilung du was absendest, ist den Komponenten vollkommen egal, sie übertragen nur Bytes. Auch SendText()/SendBuf() unterscheiden sich nur in dem Typ, wie sie die Daten annehmen. Es sind weiterhin für den Socket nur Bytes, d.h. mit SendBuf() gesendete Daten kannst du genauso mit ReceiveText() empfangen.
Du hast darum zu kümmern, dass du weisst:
a) ob du alle nötigen Daten empfangen hast, bzw. wieviele Bytes noch fehlen
b) wie die Daten organisiert sind
c) welche Daten wo und wann über den Socket verschickt werden.
Selbst wenn du einmal "Hallo" mit SendText() versendest, kannst du im schlechtesten Falle 4x im OnClientRead aufgerufen werden mit jeweils nur einem Buchstaben, bis du alles empfangen hast.
Mal anders: Die Socket Komponenten senden und empfangen Bytes, ohne irgendwelche Daten hinzu zu fügen oder zu interpretieren. Von daher kannst du damit viele Dinge implementieren, bzw. viele Protokolle. Damit kannst du ein
FTP Protokoll genauso wie
SMTP implementieren. Wenn der Socket deine Teile (wie du es dir wünscht) am anderen Ende wieder entsprechend Teilen soll, dann bräuchte er auch Informationen wo und wie die Teile zu teilen sind (also ein Protokoll). Somit: er müsste die übertragenen Bytes verändern (was anhängen), damit das klappt. Damit würden diese Komponenten aber sofort unbrauchbar, wenn man Protokolle implementieren will (wie z.B. die oben genannten).