Frage

Kinda lange Titel, aber irgendwie ...

Ich habe bei diesen Beispielen gesucht, speziell auf die Teile auf das Schreiben und die Größe der Nachricht an den Bytestreams
Lesen http://doc.trolltech.com/4.4/network-fortuneclient- Client-cpp.html
http://doc.trolltech.com/4.4/network-fortuneserver- Server-cpp.html

Aber ich kann nicht scheinen, in C #, um herauszufinden.

StreamWriter writer = new StreamWriter(tcpClient.GetStream());
writer.Write(data.Length + data);

Das funktioniert nicht sehr gut aus. Könnte mir jemand in die richtige Richtung einen Schubs geben?

War es hilfreich?

Lösung

Im Allgemeinen würden Sie die Länge zuerst senden. Beide Enden sollten zustimmen, was eine Länge sieht aus wie - zum Beispiel, könnten Sie gerne fest verwenden 4-Byte-Länge-Präfix als binär:

  byte[] data = ...
  int len = data.Length;
  byte[] prefix = Bitconverter.GetBytes(len);
  stream.Write(prefix, 0, prefix.Length); // fixed 4 bytes
  stream.Write(data, 0, data.Length);

Natürlich muss der Anrufer das gleiche tun - das heißt lesen Sie die ersten 4 Bytes die Länge zu erhalten. Zum Lesen, sollte der Empfänger darauf achten, nicht zu viele Daten zu lesen. Eine Möglichkeit ist, mit einem Begrenzungsstrom - zum Beispiel, diese Klasse kann verwendet werden, um einen Strom zu erhalten, die nicht zu viel lesen.

Wenn Sie den Overhead wollen nicht immer 4 Bytes senden, dann einige weitere interessante Codierungen sind möglich - zum Beispiel mit dem msb als Fortsetzungsblock

.

Für Informationen, protobuf-net ist ein binäres Serializer um Googles entworfen " Protokollpuffer“message-basiertes Format. Es behandelt viele Details für Sie, und könnte von Interesse sein, wenn Sie viel Zeit mit dem Schreiben Serialisierungscode nicht ausgeben möchten. Es gibt Beispiele für Steckdosen im Quickstart-Projekt,

Andere Tipps

Statt data.Length, versuchen Sie:

writer.Write(chr(data.Length) + data);

Dies wird jeden Datenblock mit einem Byte angibt, seine Länge Präfix (bis zu 255 Byte lang). Wie gewünscht, ist dies nur ein Schub. :)

Update: Ich habe daran erinnert, dass C # alle Unicode ist und so, so chr () wahrscheinlich gibt Ihnen mehr als ein Byte. Einpassen.

Ich denke, das sollte das tun: (Ich nehme an, Ihre Daten sind eine Zeichenfolge)

Stream stream = tcpClient.GetStream();
Encoding encoding = Encoding.GetEncoding("encoding name");

byte[] bytes = encoding.getBytes(data);

stream.Write(BitConverter.GetBytes((short)bytes.Length),0,2); // hope data isn't longer that 64k
stream.Write(bytes,0,bytes.Length);

Sie können auch, wenn Sie die plaintextness davon, geben Sie eine bestimmte maximale Größe und Pad die Nummer über string.Format bewahren wollen. (Sagen Sie zum Beispiel nur erlaubt 4 Zeichen in der Länge) Dies vermeidet die Probleme der Zahlen in dem nützlichen Datenstrom, und vereinfacht die Dekodierung als auch.

Eine abschließende Klar Lösung ist ein bestimmtes Zeichen zwischen Länge und Daten zu setzen, wie zum Beispiel -, dann zu einem Zeitpunkt einzelne Zeichen greifen, bis Sie ein Minus getroffen, dekodieren die abgerufene Zeichenfolge (Ignorieren die minus natürlich) und verwenden Sie dann, dass die Länge des restlichen Zeichenfolge und Ihr Ausgangscode zu bestimmen, die müssen einfach nur das Zeichen dazwischen.

hinzuzufügen geändert werden

Verwenden Sie Console.WriteLine statt schreiben, Readline statt lesen ...

Wenn Sie sprechen, reine Textnachricht zu senden, hängen Sie die Newline-Zeichen am Ende Ihrer Nachrichten. Dann lesen Bytes, bis Sie dieses Newline Zeichen begegnen und die Bytes in einen String konvertieren. Für Ihre Bequemlichkeit implementieren jede System.IO.StreamReader und System.IO.StreamReader dieses Verhalten in einem einzigen Verfahren (WriterLine oder Readline)            writer.WriteLine ( "Line to send");            String lineSent = reader.ReadLine ();

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top