AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Records als Stream versenden

Records als Stream versenden

Ein Thema von th_bone · begonnen am 9. Dez 2005 · letzter Beitrag vom 29. Dez 2005
Antwort Antwort
th_bone

Registriert seit: 16. Jun 2004
172 Beiträge
 
Delphi 2005 Professional
 
#1

Records als Stream versenden

  Alt 9. Dez 2005, 20:14
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
  Mit Zitat antworten Zitat
th_bone

Registriert seit: 16. Jun 2004
172 Beiträge
 
Delphi 2005 Professional
 
#2

Re: Records als Stream versenden

  Alt 11. Dez 2005, 12:16
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
  Mit Zitat antworten Zitat
Thanatos81
(Gast)

n/a Beiträge
 
#3

Re: Records als Stream versenden

  Alt 29. Dez 2005, 09:26
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.
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.838 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

Re: Records als Stream versenden

  Alt 29. Dez 2005, 11:21
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.
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz