Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Records als Stream versenden (https://www.delphipraxis.net/58629-records-als-stream-versenden.html)

th_bone 9. Dez 2005 19:14


Records als Stream versenden
 
Hi,

heute sehe ich den Wald vor lauter Bäumen nicht... und irgenwie finde ich auch keine
Demo bei den Indy9 und 10 demos..

ich versuche records in einem Rutsch per Stream mit Indy 10 TCPserver an den TCPclient zu senden
...was soweit auch funktioniert

aber wenn ich den stream auslese... komm ich nicht auf das gewünschte ergebnis

richtig wäre

1 1 2 3 4 5
2 1 2 3 4 5
3 1 2 3 4 5

Ergebnis ist aber

5 0 1 2 3 1082130432
5 0 1 2 3 1082130432
5 0 1 2 3 1082130432

Delphi-Quellcode:
// definition des records bei Client und Server
type
  TDataStream = record
   Sdatetime : integer;
   Sopen    : single;
   Shigh    : single;
   Slow     : single;
   Sclose   : single;
   Svolume  : integer;
   end;
Delphi-Quellcode:
procedure TForm1.tcpServerExecute(AContext: TIdContext);
var
  Msg, MsgStr : String;
  Datastream : TMemoryStream;
  streamdata : Tdatastream;

begin
 
//...

  Msg   := AContext.Connection.iohandler.ReadLn;
  MsgCom :=strtoint(Msg[1]);
  MsgStr:=trim(Msg);
  delete(MsgStr,1,1);

// ...

      case MsgCom of

// ...
       stGetData     : begin
 
                        datastream:=Tmemorystream.create;
                         for i:=1 to 1000 do begin
                           streamdata.Sdatetime:=i;
                           streamdata.Sopen   :=1;
                           streamdata.shigh   :=2;
                           streamdata.Slow    :=3;
                           streamdata.Sclose  :=4;
                           streamdata.Svolume :=5;
                           datastream.Write(streamdata,sizeof(streamdata));
                         end;

                         datastream.Position:=0;

                         IDS := TidStreamVCL.Create(datastream);

                         with AContext.Connection do begin
                           iohandler.writebufferopen;
                             // Stream versenden

                             iohandler.WriteLn(inttostr(stGetData)); // KommandoProtokol
                             Socket.Write(IDS,0,true);

                           iohandler.writebufferclose;
                         end;
                         datastream.Free;
                       end;
Delphi-Quellcode:
// Client Timer GetMessage
var
  IDS: Tidstreamvcl;
  datastream: Tmemorystream;
  streamdata: Tdatastream;
  I, size: integer;

// ....

    case MsgCom of

// ....

     stGetData :   begin
                       timergetmessage.Enabled:=false;

                       datastream:=Tmemorystream.Create;
                       IDS:=Tidstreamvcl.create(datastream);
                       size:=24000; // zum testen fest gesetzt
                       tcpclient.socket.ReadStream(IDS,Size,false);

                       datastream.Position:=0;

                       with streamdata do begin
                         while datastream.Position<datastream.Size do begin

                           datastream.Read(streamdata,sizeof(streamdata));
                           MemoAdd(inttostr(Sdatetime)+' '   +
                                   inttostr(trunc(Sopen))+' ' +
                                   inttostr(trunc(Shigh))+' '  +
                                   inttostr(trunc(Slow))+' '    +
                                   inttostr(trunc(Sclose))+' '   +
                                   inttostr(Svolume));
                         end;
                       end;
   end;
Danke für die Hilfe

Ralf

th_bone 11. Dez 2005 11:16

Re: Records als Stream versenden
 
Hi,

ich hab den Fehler im Client lokalisiert - hier die Lösung:

ersetze
Delphi-Quellcode:
size:=24000; // zum testen fest gesetzt
tcpclient.socket.ReadStream(IDS,Size,false);
durch
Delphi-Quellcode:
size := tcpclient.Socket.ReadInteger;
tcpclient.Socket.ReadStream(IDS, Size);
dann funktioniert es (getestet mit 900.000 Datensätzen)

Gibt es eigentlich einen Grund warum hier scheinbar niemand mit Indy 10 arbeitet ?

hat Indy 9 irgendwelche vorteile - ausser das alle demos die man so findet in Indy 9 sind ?!

cu

Ralf

Thanatos81 29. Dez 2005 08:26

Re: Records als Stream versenden
 
Danke dir! Genau sowas hab ich gesucht!

Warum aber anscheinend kaum jemand mit den 10ern arbeitet kann ich dir auch nicht beantworten. Ich vermute aber, dass es daran liegt, das ja doch einiges umgeschmissen wurde und viele ihre Projekte dann umschreiben müssten. Das hat zumindest nen Bekannten von mir davon abgehalten.

MaBuSE 29. Dez 2005 10:21

Re: Records als Stream versenden
 
Zitat:

Zitat von th_bone
Gibt es eigentlich einen Grund warum hier scheinbar niemand mit Indy 10 arbeitet ?
hat Indy 9 irgendwelche vorteile - ausser das alle demos die man so findet in Indy 9 sind ?!

Ich vermute das liegt daran, dass Indy 9 im Delphi 7 "vorinstalliert" ist.
Viele wissen vieleicht gar nicht, das es eine neue Version gibt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz