2016-05-16 13 views
0

Was ich versuche zu erreichen, ist ein Client einen String plus eine Datenstruktur über einen Socket senden, und einen Server erhalten, um es zu lesen und zu verarbeiten.C# senden gemischte Daten über den Socket

Zum Beispiel: Der Client sendet eine Zeichenfolge „speichern“ von einem JSON gefolgt, sollte der Server den ersten String analysiert und dann entsprechend zu handeln entscheiden (in diesem Fall sollte es die JSON deserialisieren und es irgendwo speichern)

Was ich dachte: der Server

byte[] buffernew = new byte[8]; 

Lesen Sie den ersten Brocken, die enthält nur die Zeichenfolge und dann deseria die Eingangsdaten in Blöcken von 8 Bytes aufteilen könnte Lize, welches Objekt in den nächsten Byte-Blöcken übergeben wird. (Sollte ich auch einen letzten 8-Byte-Chunk in Betracht ziehen, um zu sagen, dass die Kommunikation vorüber ist? z.B. eine klassische Zeichenkette?)

Ist dies eine praktikable Lösung? Gibt es einen besseren Weg?

Kann jemand eine Skizze der Lösung der Serverseite zur Verfügung stellen?

+0

empfangenden Ende einer Verbindung benötigen das Ende jedes Datenelements kennen (s). So können Sie einen oder mehrere der folgenden verwenden: 1) Ascii: Beenden mit einem bekannten Zeichen 2) Ascii oder Binary: Hinzufügen einer Byteanzahl zum Anfang von Datenelementen 3) Ascii oder binär: Datenelement (e) fester Länge. Sie können keine Zeichenfolgen senden, die eine Klasse in C# sind, so dass Sie eine Zeichenfolge in ein Byte [] konvertieren und mit '\ 0' enden. Eine Struktur kann fest oder variabel sein. Eine Struktur mit fester Größe kann einfach gesendet werden. Eine Struktur mit variabler Größe jedes Datenelement muss mit einer der drei obigen Methoden beendet werden. – jdweng

+0

Hinzufügen einer Byteanzahl scheint gut, aber wie erhalten Sie dann die Anzahl und verwenden Sie es zum Teilen von Informationen in Ihrem Byte-Input-Stream? – SOROMEED

+0

Wenn die Byte-Anzahl die Summe von String + Struktur ist und Sie die Zeichenfolge mit '\ 0' beenden, können Sie die Länge der Zeichenfolge abrufen. Die Struktur ist die Gesamtlänge - Stringlänge. Jedes Element benötigt eine spezifische Methode zur Bestimmung der Anfangsposition und der Endposition, die aus früheren Daten erhalten werden kann. Das Ganze ist immer gleich der Summe der Teile. – jdweng

Antwort

0

Wenn es mein C# -Code im Gespräch mit meinem C# -Code bin, verwende ich BinaryWriter und BinaryReader. Diese werden sich gut mit dem Marshalling von grundlegenden Datentypen auf und von der Leitung befassen. So tun

var bw = new BinaryWriter(stream, false); 
bw.Write("save"); 
bw.Write(json); 

am anderen Ende

var br = new BinaryReader(stream , false); 
var cmd = br.ReadString(); 
var json = br.ReadString(); 

es für Sie mit Chunking

+0

Vielen Dank für Ihren Beitrag, aber der Client könnte in einer anderen Sprache sein (vorausgesetzt, dass ein JSON oder eine andere Datenstruktur serialisiert werden kann) – SOROMEED