woher wissen Sie, wenn Sie die Byte-Arrays kombinieren müssen, die in beiden Aufrufen empfangen werden?
Sie müssen dies auf Protokollebene entscheiden. Es gibt vier gängige Modelle:
- Ende-in-Ende: Jede Seite kann nur eine einzige "Nachricht" pro Verbindung senden. Nach dem Senden der Nachricht schließen sie die Sendeseite des Sockets. Die empfangende Seite liest weiter, bis sie das Ende des Streams erreicht.
- Längenpräfix: Geben Sie vor jeder Nachricht die Anzahl der Bytes in der Nachricht ein. Dies könnte in einem Format mit fester Länge (z. B. immer 4 Bytes) oder in einem komprimierten Format (z. B. 7 Bits von Größendaten pro Byte, oberes Bit, das für das letzte Byte von Größendaten eingestellt ist) sein. Dann gibt es die Nachricht selbst. Der empfangende Code liest die Größe und liest dann viele Bytes.
- Chunking: Wie Längenpräfix, aber in kleineren Stücken. Jedem Chunk ist die Länge vorangestellt, mit einem letzten Chunk, der "Ende der Nachricht" anzeigt.
- Ende-der-Nachricht-Signal: Lesen Sie weiter, bis Sie den Terminator für die Nachricht sehen. Dies kann ein Problem sein, wenn die Nachricht in der Lage sein soll, beliebige Daten einzuschließen, da Sie einen Escaping-Mechanismus benötigen, um die Terminator-Daten in der Nachricht darzustellen.
Zusätzlich seltener gibt es Protokolle, bei denen jede Nachricht immer eine bestimmte Größe ist - in diesem Fall müssen Sie nur gehen zu halten, bis Sie, dass viele Daten gelesen habe.
In all diesen Fällen müssen Sie im Grunde Schleifen, Lesen von Daten in eine Art Puffer, bis Sie genug davon haben, aber Sie bestimmen, dass. Sie sollten immer verwenden Sie den Rückgabewert von Read
zu beachten, wie viele Bytes Sie tatsächlich lesen, und immer überprüfen Sie, ob es 0 ist, in diesem Fall haben Sie das Ende des Streams erreicht.
Beachten Sie, dass dies nicht nur Netzwerk-Streams betrifft - für etwas anderes als eine lokale MemoryStream
(die immer so viele Daten lesen, wie Sie in einem Schritt fragen, wenn es überhaupt im Stream ist), sollten Sie gehe davon aus, dass Daten möglicherweise nur im Verlauf mehrerer Anrufe verfügbar werden.
oder erstellen Sie Ihr eigenes Protokoll: D – EaterOfCode
Oder Sie könnten ein Protokoll fester Länge haben, in dem Sie die Länge der Nachrichten im Voraus kennen. Ich kann mir jedoch kein sinnvolles Beispiel vorstellen :( – NPSF3000
@EaterOfCorpses: Dies sind Optionen * in * einem Protokoll. Wie Sie das Ende einer Nachricht erkennen, ist nur ein Teil des Protokolls. –