Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Stream per TCP senden (https://www.delphipraxis.net/150681-stream-per-tcp-senden.html)

XXcD 23. Apr 2010 14:34


Stream per TCP senden
 
Hallo,
habe gerade ein kleines Problem und finde den fehler nicht.
Vielleicht habe ich ja irgendwas übersehen also der Stream wird gefüllt gesendet, aber beim Client kommt nicht wirklich etwas an.
Ich speicher zum testen die Daten in eine Textdatei und das was ankommt ist leer.

Delphi-Quellcode:
procedure TForm5.IdTCPServer1Connect(AContext: TIdContext);
var
Stream: TMemoryStream;
pktype, pksubtype: integer;
Data: string;
Len: Longint;
begin
pktype:=22;
pksubtype:=0;
Data:='Test1123';

Stream:= TMemoryStream.Create;
try
Stream.Write(pktype, SizeOf(pktype));
Stream.Write(pksubtype, SizeOf(pksubtype));

Len := Length(Data);
Stream.Write(Len, SizeOf(Len));
Stream.Write(PChar(Data)^, Len);

AContext.Connection.IOHandler.Write(Stream);
Stream.SaveToFile('C:\test.txt');
finally
Stream.Free;
end;
end;

Delphi-Quellcode:
procedure TForm5.Timer1Timer(Sender: TObject);
var
ReadStream: TMemoryStream;
begin
if IdTCPClient1.Connected then
begin
try
ReadStream:= TMemoryStream.Create;
try
IdTCPClient1.IOHandler.ReadStream(ReadStream, -1, false);
ReadStream.Position:=0;
ReadStream.SaveToFile('C:\test2.txt');
Except
//ShowError('Verbindung unterbrochen!');
end;
finally
ReadStream.Free;
end;
end
else
begin
Timer1.Enabled:=false;
ShowError('Verbindung unterbrochen!');
end;
end;

Codewalker 23. Apr 2010 14:39

Re: Stream per TCP senden
 
Auf den ersten Blick würde ich sagen, dass du nach dem Schreiben in den Stream, diesen auch wieder auf den Anfang zurücksetzen musst:

Delphi-Quellcode:
{...}
Stream.Write(Len, SizeOf(Len));
Stream.Write(PChar(Data)^, Len);

Stream.Seek(0,0);

AContext.Connection.IOHandler.Write(Stream);

XXcD 23. Apr 2010 14:54

Re: Stream per TCP senden
 
Nein bringt leider auch nichts

blackfin 23. Apr 2010 15:39

Re: Stream per TCP senden
 
Ich kenne jetzt die INDY Componenten nicht, aber hast du es mal damit versucht, die Streamgrösse mit anzugeben?:

Delphi-Quellcode:
Stream.Seek(0,0);
AContext.Connection.IOHandler.Write(Stream,Stream.Size);

chaosben 23. Apr 2010 17:13

Re: Stream per TCP senden
 
Zitat:

Zitat von blackfin
aber hast du es mal damit versucht, die Streamgrösse mit anzugeben?

Recht hat er.
Die -1 im ReadStream sagt ja: Lies als erstes die Streamgröße aus der Verbindung.
Delphi-Quellcode:
if (AByteCount = -1) and (not AReadUntilDisconnect) then begin
    // Read size from connection
    if LargeStream then begin
      AByteCount := ReadInt64;
    end else begin
    AByteCount := ReadLongInt;
    end;
  end;
Also muss man die Größe mitschicken. Und das geht ganz elegant beim Write per AWriteByteCount = true
Das sollte schon des Rätsels Lösung sein.

XXcD 23. Apr 2010 20:29

Re: Stream per TCP senden
 
Ok alles klar hat funktioniert, hätte ich auch von alleine drauf kommen können :-D
Vielen dank erstmal für die schnelle hilfe, aber wofür ist der Code den du mit angehängt hast??? Das funktioniert ja mit der -1

himitsu 23. Apr 2010 20:40

Re: Stream per TCP senden
 
Zitat:

Delphi-Quellcode:
Stream.Write(PChar(Data)^, Len);

PS: Delphi 2009 ist Unicode.

Delphi-Quellcode:
Stream.Write(PChar(Data)^, Len * SizeOf(Char));

chaosben 23. Apr 2010 21:15

Re: Stream per TCP senden
 
Zitat:

Zitat von XXcD
Vielen dank erstmal für die schnelle hilfe, aber wofür ist der Code den du mit angehängt hast??? Das funktioniert ja mit der -1

Weiß ich nicht mehr ... mir war so danach. :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:08 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