g1o2k4 - Sa 12.09.09 17:49
Titel: Komprimierte Daten/Unicode(!?) über Indy10 TCP verschicken
hallo.
jetzt bin ich schonmal weiter als vorher. ich habe zuerst versucht ein TImage.Picture.Graphic über indy tcp von client zu server zu schicken. das hat alles geklappt.
um die bandbreite zu schonen habe ich jetzt das TImage.Picture.Graphic per ZLip und MemoryStream komprimiert. das klappt auch noch.
jetzt verschicke ich die komprimierten daten über den indy tcp client...klappt auch, aber der server wirft ne EConvert exception und crasht.
der client schickt erst die länge des stream mit writeln und der server empfängt zuerst mit readln. ich vermute dort kommt die exception denn in der exception stehen die ersten bytes der komprimierten datei...obwohl er auch die länge des stream mit readln empfängt.
der empfangsteil ist das:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| with AContext.Connection do begin try InputStream := TMemoryStream.Create;
SizeOfIncomingStream := strtoint(IOHandler.ReadLn); IOHandler.ReadStream(InputStream, SizeOfIncomingStream, true); OutputStream := TMemoryStream.Create; DeCompressionStream := TZDecompressionStream.Create(InputStream); OutputStream.CopyFrom(DeCompressionStream, 0); OutputStream.SaveToFile('.\test.bmp'); Image1.Picture.Graphic.LoadFromStream(OutputStream); |
der sendeteil:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| InputStream := TMemoryStream.Create; Image1.Picture.Graphic.SaveToStream(InputStream); OutputStream := TMemoryStream.Create; CompressionStream := TZCompressionStream.Create(OutputStream, zcFastest); CompressionStream.CopyFrom(InputStream, 0); CompressionStream.Free; InputStream.Free; OutputStream.SaveToFile('.\test.jpg.bzip'); OutputStream.Position := 0; SendStream := TMemoryStream.Create; Outputstream.SaveToStream(Sendstream); Outputstream.Free;
try with TCPClient do begin Connect; try IOHandler.WriteLn(IntToStr(SendStream.Size)); IOHandler.WriteBufferOpen; IOHandler.Write(SendStream); IOHandler.WriteBufferFlush; IOHandler.WriteBufferClose; finally Disconnect; end; end; finally Sendstream.Free; end; |
also ohne komprimierung hat es problemlos geklappt...
edit: die genaue exception:
Erste Gelegenheit für Exception bei $7713E124. Exception-Klasse EConvertError mit Meldung
'''xm\As8 P6,8KN@XsG8
WhFCh:]$mG2*J/_I'6TuJ*kgA?~y_|ym{}}W|mW|eOoozemm7?~zW[[?}7?~/w/ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ^:?$,D @`$@m1ado;{^g7z )p{<`cff&@ 4guv~|Jkm1]?3 @ {mYq\p,^{?y +m\pO#epo7_ @ }*>w+fT7jF#@ gVxN.cy`N pL`Egj
9[.&@ <G__<^~!@ _<7?
8K|q
xpvx0xti3zto @ @jNG*Nk+ @ & W/+;svn$@ <~-]'v{8 rxws:1mojD%`Y7.~7 q6F&@ 9NWxs>FY, 0^@?GyW @`@kG/>O ~n,Y\V=-Y5dO |-}OY}6<ob[+Tbjqs @`/g
l}>es
Yv'' ist kein gültiger Integer-Wert'.
im prinzip ist das die komprimierte datei die da steht, aber wieso will er die nach integer konvertieren? ich will sie doch nur als stream haben...hilfe! ^^
muss ich vielleicht irgendwo einstellen, dass der stream in unicode gesendet/emfpangen werden soll?
jaenicke - So 13.09.09 09:41
Xentar hat folgendes geschrieben : |
sondern immer direkt angegeben, wie viele Daten ich haben möchte (in diesem Fall einen Integer, also 4 Byte). |
Vor allem weil man sich hier dann auch das IntToStr beim Senden schenken kann und direkt den Wert schicken kann.
Xentar hat folgendes geschrieben : |
Edit:
Relative Dateipfade sind böööse |
Ist doch lustig, wenn die Datei plötzlich irgendwo anders auf der Festplatte landet. Ohne ein bisschen Glücksspiel wäre es doch langweilig. :mrgreen:
Und mit ein bisschen Glück trifft man die Datei beim Laden sogar wieder. :D