![]() |
Stream mit Indy versenden
Hallo,
ich versuche mit folgendem Code einen Stream mit Indy zu versenden:
Delphi-Quellcode:
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.
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; Gruß Spurius |
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; |
Re: Stream mit Indy versenden
Hallo,
ich will eigentlich den Wert von Car.Munition lesen. Nicht die Größe davon. |
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; |
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 |
Re: Stream mit Indy versenden
Hallo,
und erzeugte TMemoryStreams müssen am Ende auch wieder freigegeben werden. |
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; |
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:
// Wenn Du ein Objekt oder einen Stream verschicken willst :
//Server :
Var iMunition : Longint; begin iMunition := AThread.Connection.ReadInteger; end; //Client Client.WriteInteger(Car.Munition);
Code:
Ich hoffe ich konnte damit, einige Fragen kären,
//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; Gruß Data |
Re: Stream mit Indy versenden
Hallo,
ich wollt erstmal das Prinzip mit dem stream klären, bevor ich weitere Daten versende. |
Re: Stream mit Indy versenden
Hi,
versuch mal statt
Delphi-Quellcode:
lieber
RecInfos.Read(test, sizeof(test));
Delphi-Quellcode:
RecInfos.Read(Test,RecInfos.Size);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:26 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