AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Beispiel zum Versenden von Dateien mit Indy
Thema durchsuchen
Ansicht
Themen-Optionen

Beispiel zum Versenden von Dateien mit Indy

Ein Thema von DataCool · begonnen am 12. Dez 2003 · letzter Beitrag vom 20. Okt 2008
Antwort Antwort
Seite 4 von 6   « Erste     234 56      
Benutzerbild von DataCool
DataCool
Registriert seit: 10. Feb 2003
Hi Leute,

auf vielfachen Wunsch habe ich nochmal ein Beispiel zum Versenden von Dateien mit Indy erstellt.

Das Beispiel enthält Client und Server incl. Sourcecode natürlich.

Desweiteren verfügen Client und Server über eine Progressbar die den Übertragungsstatus anzeigt und eine Anzeige der aktuellen Sendegeschwindigkeit.

Würde mich über ein kleines Feeedback freuen

Gruß Data
Angehängte Dateien
Dateityp: zip filesend_clientserver_197.zip (445,0 KB, 2009x aufgerufen)
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
 
jonny

 
Delphi 7 Enterprise
 
#31
  Alt 6. Jan 2004, 11:15
Also soweit so gut habe es soweit denke ich verstanden es gab nur einen kleinen Fehler

habe aber die Zeile
Code:
.Bindings := 0.0.0.0:7000;
in
Code:
.Bindings := 127.0.0.1:7000;
geändert und dann hat es funktioniert.

Bin schon gespannt wie es weiter geht!!!


Danke übrigens es ist wirklich nett das du mir hilfst.
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH
 
#32
  Alt 6. Jan 2004, 18:59
Bindings mit 0.0.0.0 sollten eigentlich auch funktionieren, beim mir geht das.

Nun, wie geht es weiter ? Ehrlich gesagt ich weiß es nicht da es ja DEIN Projekt ist D.h. es hängt von dir ab wie es weitergeht, den Kern habe ich dir ja gezeit, und so schwierig war's ja dann doch nicht.
Möchtest du zB. im Server ebenfalls eine Progressbar (was ich nicht empfehle) musst du bedenken das ein Server sehr viele Clients zur gleichen Zeit in verschiedenen Threads bedienen wird. D.h. eigentlich müsste für jeden Aufruf des OnExecute() Ereignisses eine eigene ProgressBar her. Beachte, .OnExecute() wird bei INDY in einem eigenen Thread aufgerufen. D.h. für jeden Client der mit dem Server verbindet spaltet TidTCPServer einen eigenes Thread Object ab. Diese ruft dann in SEINEM TThread.Execute; eben das Event TidTCPServer.OnExecute() auf.

Du kannst die Funkionalität erweitern um die Fähigkeit eines Downloads eienr Datei auf Clientseite. Dazu muß der Client erstmal wissen was er downloaden kann. D.h. eine neues Kommando muß her das ein Listing der Dateien abfragt. Dann ein Kommando zum Download einer Datei.

Schwieriger wird es dann aber schon einen interupted/delayed/multiple Download/Upload zu programmieren. In diesem Falle MUSS der Datenbereich der Dateiübertragung Häppchenweise erfolgen. Denn nur so kann der Client/Server mitbekommen wieviele Daten schon übertragen wurde. Man könnte aber auch bei meinem ursprünglichen Konzept bleiben. Dann müsste sich der Client aber erneut nach einem Abbruch ver Verbindung beim Server einloggen. Danach fragt er den Dateistatus der abgerbochenen Datei ab, und überträgt nur den Rest.

Gruß Hagen
  Mit Zitat antworten Zitat
jonny

 
Delphi 7 Enterprise
 
#33
  Alt 6. Jan 2004, 19:42
Also es soll mal ein kleiner Chat werden in dem man die möglichkeit hat dateien zu schicken also gibt es nicht so viele verbindungen zum server und ich würde dann auch son ganz gerne die ProgressBar im Server einbauen. wie mache ich dass denn das der server eine Art Panel auf dem die ProgressBar liegt mit Label wo der Dateiname angezeigt wird erstellt und diesen nach den Upload destroyed. Ich meine er muss ja irgendwie wissen welche jetzt fertig ist und welche zerstört werden muss. Die anderen die evtl dahinter liegen müssen nachrücken damit es optisch schöner ist. Also ich stelle mir das doch sehr kompliziert vor.
  Mit Zitat antworten Zitat
jonny

 
Delphi 7 Enterprise
 
#34
  Alt 8. Jan 2004, 01:02
Also wenn ich beim TCPServer die Eigenschaft "Reuse Socket" auf rsOSDependet stelle dann kann ich auch unter "Bindings" 0.0.0.0:7000 einstellen ansonsten kann ich nur an mich selber dateien schicken.
  Mit Zitat antworten Zitat
ATwardz

 
Delphi 7 Professional
 
#35
  Alt 15. Jan 2004, 16:32
Sorry das ich so lange gebraucht habe aber ich war in den Ferien weg und dann hat die Telekom mir noch das Inet abgeschaltet!
Hab den Anbieter gewechselt!

Wennn es dir noch hilft hier mein Prog!
Angehängte Dateien
Dateityp: rar net_send_bigger.rar (426,9 KB, 238x aufgerufen)
  Mit Zitat antworten Zitat
DevilsCamp
 
#36
  Alt 26. Aug 2004, 13:37
*aufwärm*

Hallo.

Ich habe die Files von ATwardz gezogen um sie mir genauer anzuschauen.
Anschließend habe ich ich Programm geschrieben, das gleichzeitig als Client und Server dient, da ich ein kleines, ICQ-ähnliches Programm enwerfen will, mit dem man auch Dateien versenden können soll.

Ich habe folgenden Aufbau:

Formular1 (Main-Form):
GroupBox1 mit 2 TEdits für IP und Port eines Datei-Empfängers und einem Senden Button1
GroupBox2 mit 2 TEdits um Listen-IP und Listen-Port der TIdTCPServer-Komponente einzurichten und einer Mach-Aktiv-Checkbox.


Formular2 (Fortschritts-Anzeige):
Labels für Namen der Datei, Größe, übermittelte Bytes und Gauge für Fortschrittsanzeige.

Formular2 wird z.Z. gleich beim Start des Programms erstellt (warum erklär ich später, siehe **), aber erst angezeigt, wenn ein Transfer stattfindet (mit Formular2.Show). Nach dem Fransfer wird das Formular mit Formular2.Hide wieder ausgeblendet.

Wenn ich nun von PC1 eine Datei zu PC2 sende, dann öffnet sich bei beiden PCs wie erwartet das Transfer-Fenster und wird auch nach dem Transfer wieder ausgeblendet.
Schliesse ich aber nun auf dem Empfänger-PC das Programm, dann bekomme ich eine Fehlermeldung und der PC verliert stark an Performance (der greift ständig auf die Platte zu).

Ich habe schon alles überprüft, aber ich finde keine Lösung zu dem Problem.
Wenn jemand den Quell-Text braucht, so gebe ich ihn gerne an...



**
Wenn ich das Formular2 innerhalb der Receiver-Unit erstellen lasse (in der Create-Anweisung), dann hängt sich das Programm komplett auf, wenn es in der Synchronize-Methode versucht ein Label des Formulars zu verändern...
Miniaturansicht angehängter Grafiken
fehler_110.jpg  
  Mit Zitat antworten Zitat
cgimda
 
#37
  Alt 26. Jan 2005, 14:09
Hallo ich das gleiche Problem wie jonny.
Wenn ich das Projekt runterlade und ausführe dann funktioniert alles bestens, wenn ich aber die Projektdateien öffne und neu Compiliere (Delphi 7 Pro) so funktioniert das ganze nicht mehr.

Ich habe herausgefnunden an was es liegt, konnte aber das Problem nicht lösen.

Das Problem liegt in folgender Funktion:

Delphi-Quellcode:
function TFileReceiver.Start : Boolean;
Var bError : Boolean;
      bReady : Boolean;
      fs : TFileStream;
begin
   result := true;
   if iFileSize > 0 then begin
      // Alle Startwerte setzen
      bError := false;
      bReady := false;
      iReceivedBytes := 0;
      // erstmal versuchen die Datei zu erstellen
      // das Zielverzeichnis wo die Daten gespeichert werden sollen könnt Ihr nachher selber bestimmen
      sFileName := 'C:\'+sFileName;
      try
         fs := TFileStream.Create(sFileName,fmCreate or fmShareExclusive);
      except
         // Fehler beim Erstellen der Datei aufgetreten
         result := false;
         exit;
      end;
      try
         // Solange keine Abbruch Bediengung erreicht ist Stream-Pakete lesen
         While (not AThread.Terminated) and (AThread.Connection.Connected) and
                  (not bError) and (not bReady) do begin
            // Buffer(Speicher-Stream) leeren
            tmpMS.clear;
            try
               // versuchen Stream zu Lesen
               AThread.Connection.ReadStream(tmpMS);
               // Steht jetzt auch wirklich was im Stream drin
               if tmpMS.Size > 0 then begin
                  // die gelesenen Bytes jetzt direkt in den FileStream schreiben
                  fs.copyFrom(tmpMS,0);
                  // Anzahl der gelesenen Bytes erhöhen
                  iReceivedBytes := iReceivedBytes + tmpMS.Size;
                  // jetzt durch den Thread die Methode UpdateProgress ausführen
                  // dieses muss mit Syncronize gemacht werden, mehr dazu in Delphi Hilfe
                  AThread.Synchronize(UpdateProgress);
               end;
               bReady := (fs.Size = iFileSize);
            except
               // Fehler beim Lesen des Stream aufgetreten, Speicher leeren
               tmpMS.Clear;
               // Vorgang abbrechen
               bError := true;
            end;
         end;
      finally
         fs.free;
         if bError then
            DeleteFile(sFileName);
      end;
      result := FileExists(sFileName);
   end;
end;
Genauer gesagt liegt es an dieser Zeile:

Delphi-Quellcode:
// jetzt durch den Thread die Methode UpdateProgress ausführen
// dieses muss mit Syncronize gemacht werden, mehr dazu in Delphi Hilfe
AThread.Synchronize(UpdateProgress);
Wenn ich also "AThread.Synchronize(UpdateProgress);" aus der Funktion herausnehme funktioniert das Programm wieder. Leider ist dann die ProgressBar nicht mehr verfügbar.

Wenn ich also während des Empfangen, irgendetwas versuche anzuzeigen bleibt das Programm hängen. Und Wenn es nur ein "Refresh" ist.

Kann mir jemand sagen warum das bei Delphi 7 so ist? DataCool hat es mit Delphi 5 programmiert und es hat funktioniert. Hat jemand eine Lösung für das Problem?
  Mit Zitat antworten Zitat
Benutzerbild von Rastaman
Rastaman

 
Turbo C++
 
#38
  Alt 1. Feb 2005, 14:26
Wie funktioniert denn das empfangen von Streams mit den Sockets aus Delphi 6?
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

 
Delphi 10.3 Rio
 
#39
  Alt 1. Feb 2005, 15:55
Hi Gerrit89,

für Delphi6 kannst Du einfach mein Beispiel verwenden.
Bei Fragen einfach melden.

mfg DataCool
  Mit Zitat antworten Zitat
Benutzerbild von Rastaman
Rastaman

 
Turbo C++
 
#40
  Alt 2. Feb 2005, 18:24
ja aber es gibt die drei komponenten nicht. Server, Client und antifreeze. Ich brauche das ganze mit den Clientsockets.
Hab nur Personal


<-------
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 6   « Erste     234 56      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:29 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