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:
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?