Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Stream mit Indy versenden (https://www.delphipraxis.net/17284-stream-mit-indy-versenden.html)

Spurius 2. Mär 2004 16:10


Stream mit Indy versenden
 
Hallo,
ich versuche mit folgendem Code einen Stream mit Indy zu versenden:
Delphi-Quellcode:
Sourcecode:
procedure TForm1.ServerExecute(AThread: TIdPeerThread);
var Big: Integer;
    RecInfos: TMemoryStream;
    Test: Integer;
begin
 Big := Athread.Connection.ReadInteger;   // Größe von Car.Munition
 RecInfos := TMemoryStream.Create;
 Athread.Connection.ReadStream(RecInfos, Big);    //Hier soll der Stream gelesen werden
 Test := RecInfos.Read(Car.Munition, Big);
 Menup.Caption := IntToStr(Test);
end;

procedure TForm1.Timer2Timer(Sender: TObject);
Var Infos: TMemoryStream;
begin
 Infos := TMemoryStream.Create;
 Infos.WriteBuffer(Car.Munition, SizeOf(Car.Munition));   //Car.Munition ist ein Integerwert
 Client.WriteInteger(SizeOf(Car.Munition));                   //Hier soll die Größe des Streams an den Server übermittelt  
 Client.WriteStream(Infos,true,True,0);                        //werden
end;
Leider ist die Menup.Caption 0. Ich kenn mich mit Streams nicht wirklcih aus, deshalb kann es sein, dass ich mit dem Stream was falsch mache.
Gruß
Spurius

Manzoni 2. Mär 2004 16:25

Re: Stream mit Indy versenden
 
Delphi-Quellcode:
procedure TForm1.ServerExecute(AThread: TIdPeerThread);
var Big: Integer;
    RecInfos: TMemoryStream;
    Test: Integer;
begin
Big := Athread.Connection.ReadInteger;  
RecInfos := TMemoryStream.Create;
Athread.Connection.ReadStream(RecInfos, Big);    
RecInfos.Position:=0;
Test := RecInfos.Read(Car.Munition, Big);   //Wenn ich das richtig sehe, willst du die Anzahl der gelesenen
Menup.Caption := IntToStr(Test);            // Bytes ausgeben?   
end;

Spurius 2. Mär 2004 18:02

Re: Stream mit Indy versenden
 
Hallo,
ich will eigentlich den Wert von Car.Munition lesen. Nicht die Größe davon.

Manzoni 3. Mär 2004 21:15

Re: Stream mit Indy versenden
 
probier das mal:
Delphi-Quellcode:
procedure TForm1.ServerExecute(AThread: TIdPeerThread);
var Big: Integer;
    RecInfos: TMemoryStream;
    Test: Integer;
begin
Big := Athread.Connection.ReadInteger;  
RecInfos := TMemoryStream.Create;
Athread.Connection.ReadStream(RecInfos, Big);    
RecInfos.Position:=0;
RecInfos.Read(Test,Sizeof(Test));  
RecInfos.Read(Test,RecInfos.Size); //eins von beiden müsste gehen
Menup.Caption := IntToStr(Test);            
end;

DataCool 4. Mär 2004 08:49

Re: Stream mit Indy versenden
 
Hi,

wichtig ist vielleicht auch, das es nicht notwendig ist die größe des kommenden Streams vorweg zu schicken.
ReadStream und WriteStream haben entsprechende Parameter, die zum um das Senden der Streamgrösse selber kümmern.


Gruß Data

Jens Schumann 4. Mär 2004 09:38

Re: Stream mit Indy versenden
 
Hallo,
und erzeugte TMemoryStreams müssen am Ende auch wieder freigegeben werden.

Spurius 4. Mär 2004 14:35

Re: Stream mit Indy versenden
 
Hallo,
ich bekomm jetzt 67108864, Car.Munition ist aber 10. Hier der Code:
Delphi-Quellcode:
procedure TForm1.ServerExecute(AThread: TIdPeerThread);
var Big: Integer;
    RecInfos: TMemoryStream;
    Test: Integer;
begin
Big := Athread.Connection.ReadInteger;
RecInfos := TMemoryStream.Create;
Athread.Connection.ReadStream(RecInfos, Big);
RecInfos.Position:=0;
RecInfos.Read(test, sizeof(test));  
Menup.Caption := IntToStr(Test);
recinfos.Free;        
end;


procedure TForm1.Timer2Timer(Sender: TObject);
Var Infos: TMemoryStream;
begin
 Infos := TMemoryStream.Create;
 Infos.WriteBuffer(Car.Munition, SizeOf(Car.Munition));
 Client.WriteInteger(SizeOf(Car.Munition));
 Client.WriteStream(Infos,true,True,0);
 infos.Free;
end;

DataCool 4. Mär 2004 15:49

Re: Stream mit Indy versenden
 
Hi,

irgentwie finde ich das absolut schwachsinnig was Du da gerade versuchst.

Entweder Du willst nur einen Zahlenwert verschicken, dann arbeitest Du mit WriteInteger bzw. ReadInteger(gibts auch für SmallInt und Cardinal) oder Du verschickst wirklich ein Objekt in einem Buffer(z.B. eine DAtei).

Wenn Du nur eine Zahl verschicken willst :

Code:
//Server :
Var iMunition : Longint;
begin
  iMunition := AThread.Connection.ReadInteger;
end;

//Client
Client.WriteInteger(Car.Munition);
// Wenn Du ein Objekt oder einen Stream verschicken willst :

Code:
//Server :
Var ms : TMemoryStream;
begin
  ms := TMemoryStream.Create;
  try
    try
      AThread.Connection.ReadStream(ms);
    except
      ms.clear;
    end;
    if ms.Size > 0 then
      ms.SavetoFile('C:\TransferedFile.txt');
  finally
    ms.free; // Speicher wieder freigeben
  end;
end;


//Client :
Var ms : TMemoryStream;
begin
  ms := TMemoryStream.Create;
  try
    // Memory-Stream mit den Daten füllen die verschickt werden sollen, hier als Bsp. eine Datei
    ms.loadFromFile('c:\Autoexec.bat');
    ms.Position := 0; // Zur Sicherheit auf Anfang setzen
    Client.openwriteBuffer;
    Client.writeStream(ms);
    Client.CloseWriteBuffer;
  finally
    ms.free; // Speicher wieder freigeben
  end;
end;
Ich hoffe ich konnte damit, einige Fragen kären,

Gruß Data

Spurius 4. Mär 2004 16:14

Re: Stream mit Indy versenden
 
Hallo,
ich wollt erstmal das Prinzip mit dem stream klären, bevor ich weitere Daten versende.

Manzoni 4. Mär 2004 17:50

Re: Stream mit Indy versenden
 
Hi,

versuch mal statt
Delphi-Quellcode:
RecInfos.Read(test, sizeof(test));
lieber
Delphi-Quellcode:
RecInfos.Read(Test,RecInfos.Size);


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:33 Uhr.
Seite 1 von 2  1 2      

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