C # Sendeformat des Objekts mit serialisierten Objekt über Async-Socket-Verbindung
-
28-09-2019 - |
Frage
Ich möchte ein Objekt serialisiert und über das Netzwerk senden. Ich habe es eingerichtet mit ISerializeable Attribute auf meiner Klasse und BinaryFormatter das Objekt in Bytes zu konvertieren. Ich kann das Objekt und deserialisieren es auf der Empfängerseite senden. Um jedoch zu gewährleisten, dass ich das gesamte Objekt haben, bevor Sie versuchen, es zu rekonstruieren, möchte ich zusammen mit dem Strom der Größe senden. Ich mag die ersten paar Bytes als die Größe einzustellen, zu überprüfen, wenn die empfangenen Daten zumindest diese feste Größe ist, dann kann ich das gelesen und die volle Größe des Objekts erhalten. Dann ist es einfach eine Frage des Wartens, bis meine empfangenen Daten die Größe des Objekts ist + die feste Größe Bytes. Wie kann ich meine Daten in meinem Stream versetzt, so dass ich einen int senden kann die Größe des Objekts, wie die ersten paar Bytes zu speichern, und meine Aufgabe als die übrigen Bytes?
Lösung
Die richtige Antwort lautet:
SocketPacket socketData = (SocketPacket)asyn.AsyncState;
socketData.currentSocket.EndReceive(asyn);
byte[] data = socketData.dataBuffer;
Ist nicht die richtige Art und Weise von einem SocketPacket
lesenAndere Tipps
MemoryStream resultStream = new MemoryStream();
resultStream.Write(BitConverter.GetBytes(objectStream.Length));
resultStream.Write(objectStream.ToArray());
// send the resultStream
Kann man nur serialize zu einem MemoryStream
, dann einmal das getan add ist die .Length
vom MemoryStream
, gefolgt von den Daten (Verwendung GetBuffer()
und kopiert .Length
aus der Array-Bytes). Rückwärts an dem Empfänger; Lesen die Länge (typischerweise 4 Byte), dann in eine MemoeryStream
dass viel Datenstapel; Zurückspulen des MemoryStream
(Position=0
) und deserialisieren. Natürlich müssen Sie endianness usw. zustimmen.
(siehe, und ich habe auch nicht erwähnt, Schu ... oh, die andere Sache)
Was genau wollen Sie verhindern? TCP bereits verfügt über eine integrierte in Konsistenz und Zuverlässigkeit überprüft.