Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy10 / etwas probleme mit selbstgebastelter unit (https://www.delphipraxis.net/70084-indy10-etwas-probleme-mit-selbstgebastelter-unit.html)

alleinherrscher 24. Mai 2006 19:20


Indy10 / etwas probleme mit selbstgebastelter unit
 
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

alleinherrscher 24. Mai 2006 21:01

Re: Indy10 / etwas probleme mit selbstgebastelter unit
 
Okay, ich habe noch ein bisschen was rausgefunden:

Er springt im Server ab, und zwar sobald er anfängt, etwas mit AContext zu machen. Also angezeigt wird die Zeile "with AContext do..."

Kann es sein dass ich einfach nicht die speicheradressen so umlegen darf, dass das on... Ereignis auf meine prozedur gelenkt wird?

Kann ich das On..Ereignis denn irgendwie anders "umlenken" ohne private und public zu benutzten?

inherited 24. Mai 2006 22:14

Re: Indy10 / etwas probleme mit selbstgebastelter unit
 
Bei Delphi-Treff suchenPointer
Bei Delphi-Treff suchenZeiger


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