Prob mit Image via TCP senden und empfangen

04/06/2010 - 18:29 von Klaus Mayer | Report spam
Hallo,

ich möchte Bilder via Socket-Conn versenden. Mit einem kleinen Bild (5kb)
klappt das auch ohne Probleme.
Client:
Bitmap tImage = new Bitmap("C:\\CIMG1341tmp.jpg");
byte[] bStream = imageToByteArray(tImage);
byte[] header = BitConverter.GetBytes(bStream.Length);
byte[] dat = CombineArrays(ref header, ref bStream);
sock.Send(dat);

Server:
byte[] t = new Byte[4];
ns.Read(t, 0, 4);
int len = BitConverter.ToInt32(t, 0);
//Datenarray erstellen
data = new byte[len];
long readed = 0;
do{
readed+= ns.Read(data, 0, data.Length);
}
while (ns.DataAvailable);
MemoryStream ms = new MemoryStream(data, 0,
data.Length);
Image returnImage = Image.FromStream(ms);
returnImage.Save("C:\\kopie.jpg",
System.Drawing.Imaging.ImageFormat.Jpeg);
ms.Close();
Console.WriteLine("Image received");

Wenn das Bild allerdings grösser ist (2Mb und mehr) bekomme ich beim
widerherstellen des Images eine Exeption, das ein Parameter invalid sei.
Offenbar werden nicht alle Daten gelesen oder gesendet (Socket zu schnell
geschlossen?). Woran kann das liegen oder wie kann ich das beheben?

Für Eure Tipps dankend,

Klaus
 

Lesen sie die antworten

#1 Thomas Scheidegger
04/06/2010 - 19:28 | Warnen spam
Hallo Klaus

do{
readed+= ns.Read(data, 0, data.Length);
}



hier wird das 'data' Array immer wieder überschrieben,
weil offset= 0 ?

while (ns.DataAvailable);



'DataAvailable' ist ein relativ untaugliches Kriterium.
Besser mit zB einer bekannten Lànge aus Header arbeiten,
oder solange Read return >0 (ende Session).


byte[] t = new Byte[4];
ns.Read(t, 0, 4);



es ist im Prinzip nicht absolut garantiert,
dass u.U. nicht schon die ersten 4 Bytes 'Header' fragmentiert sein könnten.



Thomas Scheidegger - 'NETMaster'
http://dnetmaster.net/

Ähnliche fragen