Für UDP, das ist wahr, weil alle von der App geschriebenen Daten werden in einem UDP-Datagramm gesendet.
Für TCP ist das nicht wahr, es sei denn, die Anwendung sendet nur 1 Byte Daten gleichzeitig. Ein Schreiben in einen TCP-Socket schreibt alle Daten in einen Puffer, der diesem Socket zugeordnet ist. TCP liest dann Daten aus diesem Puffer im Hintergrund und sendet sie an den Empfänger. Wie viele Daten TCP sendet tatsächlich in einem TCP-Segment auf Variablen seiner Flußsteuerungsmechanismen abhängt, und anderen Faktoren, einschließlich:
- Fenster von dem anderen Knoten (Empfänger) veröffentlichten Erhalten
- Datenmenge in früheren gesendet Segmente im Flug, die noch
- Langsamer Start und die Vermeidung von Staus Algorithmus Zustand
- vereinbarte maximale Segmentgröße (MSS)
in TCP, können Sie nie assum nicht anerkannt werden e Was die Anwendung in einen Socket schreibt, wird tatsächlich in einem vom Empfänger gelesenen Zustand empfangen. Daten im Socket-Puffer können in einem oder mehreren TCP-Segmenten an den Empfänger gesendet werden. In jedem Moment, in dem Daten verfügbar gemacht werden, kann der Empfänger ein Socket lesen und mit den Daten zurückkehren, die zu diesem Zeitpunkt tatsächlich verfügbar sind.
Natürlich werden alle gesendeten Daten schließlich den Empfänger erreichen, wenn es keinen Fehler in der Mitte gibt, der das verhindert, und wenn der Empfänger die Verbindung nicht schließt oder das Lesen stoppt, bevor die Daten ankommen.
Bob, Ihre Frage ist gut und viele Programmierer haben den Fehler, dass sie denken, dass, wenn sie N Bytes in einem TCP-Socket senden, der andere Knoten alle N Bytes lesen wird. Dann laufen sie Funktionstest und funktioniert. Dies ist jedoch ein Fehler, der zu einem bestimmten Zeitpunkt einen Fehler im System auslösen wird. Sie möchten ein einfaches Protokoll für die Anwendungsschicht erstellen, normalerweise TLV (Type, Length, Value). Ich erkläre es hier (das Problem gilt für jede Programmiersprache): http://stackoverflow.com/questions/19839172/how-to-read-all-of-inputstream-in-server-socket-java/19863726#19863726 – rodolk