Autor Beitrag
g1o2k4
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 493



BeitragVerfasst: Sa 12.09.09 17:49 
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:
ausblenden 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;

        //empfangen
        SizeOfIncomingStream := strtoint(IOHandler.ReadLn);//hier oder 1 zeile drunter crash...
        IOHandler.ReadStream(InputStream, SizeOfIncomingStream, true); 
        // Inputstream.Position := 0;

        // Dekomprimieren
        OutputStream := TMemoryStream.Create;
        DeCompressionStream := TZDecompressionStream.Create(InputStream);
        OutputStream.CopyFrom(DeCompressionStream, 0);
        OutputStream.SaveToFile('.\test.bmp');
        Image1.Picture.Graphic.LoadFromStream(OutputStream);


der sendeteil:
ausblenden volle Höhe 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:
// Komprimieren
    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'); //klappt
    OutputStream.Position := 0;
    SendStream := TMemoryStream.Create;
    Outputstream.SaveToStream(Sendstream);
    Outputstream.Free;

    try
      { Senden }
      with TCPClient do
      begin
        Connect;
        try
          IOHandler.WriteLn(IntToStr(SendStream.Size));
          IOHandler.WriteBufferOpen;
          IOHandler.Write(SendStream); //scheint auch zu gehn
          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{<` cf f&@  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?
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Sa 12.09.09 18:44 
Bei ReadLn kann es sein, dass das Zeilenende-Zeichen noch mit zurückgegeben wird.
Warum er den gesamten Stream versucht, in einen Integer zu wandeln weiß ich nicht - ich hab mich auf so ne Grütze wie "ReadLn" noch nie verlassen, sondern immer direkt angegeben, wie viele Daten ich haben möchte (in diesem Fall einen Integer, also 4 Byte).

Und hier auch nochmal die Anmerkung:
Wenn man mit Streams spielt, muss man diese vor dem Auslesen "zurückspulen", also Position auf 0 setzen.

Edit:
Relative Dateipfade sind böööse

_________________
PROGRAMMER: A device for converting coffee into software.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 13.09.09 09:41 
user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
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