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