Hi@all!
Ich bin gerade dabei, eine eigentständige
Unit zu schreiben, die mit Hilfe von
Indy-
TCP Server und Client Dateistreams verschicken kann. Ich stelle mir folgendes vor:
Ich will einfach nur hinschreiben meineUnit.versendeStream(derStream,IpAdresse)
Um den Rest soll ich die
Unit kümmern, in ihr soll server und client erzeugt und verwaltet werden.
ich habe dafür folgenden Code erstellt:
Delphi-Quellcode:
unit MeineUnit;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent,IdStreamVCL, IdComponent, IdTCPServer,IdTCPConnection,
IdTCPClient,IdContext;
var
TCPClient1: TIdTCPClient;
TCPServer1: TIdTCPServer;
procedure Start(port:integer);
procedure Stop();
procedure SendStream(Stream: TFilestream;Host:
String);
procedure ReceiveStream(Acontext:TidContext);
implementation
procedure Start(port:integer);
{
+Aktiviert TCPClient und TCPServer
+Sollte immer am Start des Programms aufgerufen werden.
+zuletzt editiert: 24.05.06
}
begin
TCPClient1:= TIdTCPClient.Create;
TCPClient1.Port:=Port;
with TCPClient1
do
begin
ReadTimeout:=5000;
ConnectTimeout:=5000;
end;
TCPServer1:= TIdTCPServer.Create;
@TCPServer1.OnExecute:=@ReceiveStream;
with TCPServer1
do
begin
MaxConnections:=1;
DefaultPort:=Port;
Active:=True;
end;
end;
procedure Stop();
{Stopt Server und Client, gibt Speicher frei.
zuletzt editiert: 24.06.05}
begin
TCPClient1.Free;
TCPServer1.Active:=False;
TCPServer1.Free;
end;
procedure SendStream(Stream: TFilestream;Host:
String);
{
+Versendet vom TCPClient an TCPServer einen Filestream
+Dieser wird als Parameter übergeben, und muss vorher erzeugt worden sein.
+zuletzt editiert: 24.05.06
}
var
IndyStream: TidStreamVCL;
begin
TCPClient1.Host:=Host;
try
IndyStream := TidStreamVCL.Create(Stream);
try
{ Senden }
with TCPClient1
do
begin
Connect;
try
Socket.
Write(IndyStream, 0, true);
finally
Disconnect;
end;
end;
finally
FreeAndNil(IndyStream);
end;
finally
FreeAndNil(Stream);
end;
end;
procedure ReceiveStream(Acontext:TidContext);
var
FSTream: TFileStream;
SizeOfIncomingStream: Integer;
IDS: TidStreamVCL;
begin
FStream := TFileStream.Create('
C:\test.tmp', fmCreate);
try
IDS := TidStreamVCL.Create(FStream);
try
{ Empfangen }
with AContext.connection
do
begin
try
SizeOfIncomingStream := Socket.ReadInteger;
Socket.ReadStream(IDS, SizeOfIncomingStream);
finally
Disconnect;
end;
end;
{ Damit der Inhalt von IDS in FStream übertragen wird }
IDS.VCLStream.Position := 0;
finally
FreeAndNil(IDS);
end;
finally
FreeAndNil(FStream);
end;
end;
end.
Leider überträgt das ganze System noch keine Dateien. D.h. Die Datei kommt zwar an, ist aber leer, also wird der filestream nicht aufgefüllt.
Ich weiß, das ist jetzt ziemlich blöd, weil ich den fehler nicht genauer eingrenzen kann, aber ich hab mir schon stundenlang den kopf darüber zerbrochen...kann das was mit dem "@TCPServer1.OnExecute:=@ReceiveStream;" zu tun haben...was genau bewirkt das "@" eigentlich?
Sorry, dass ich hier mit so was aufwendingem einfach reinplatze
Wäre cool, wenn ihr ne lösungsidee habt
Vielen lieben dank,
euer alleinherrscher