AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Probleme beim Versenden von Dateien mit Indy TCPClient
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme beim Versenden von Dateien mit Indy TCPClient

Ein Thema von Chris1986 · begonnen am 27. Sep 2003 · letzter Beitrag vom 28. Apr 2004
Antwort Antwort
Seite 1 von 3  1 23      
Chris1986

Registriert seit: 17. Jul 2003
Ort: Aachen
350 Beiträge
 
Delphi 7 Enterprise
 
#1

Probleme beim Versenden von Dateien mit Indy TCPClient

  Alt 27. Sep 2003, 16:25
Hi,
ich habe ein kleines Client-Programm geschrieben, das einem Server-Programm Dateien schicken kann. (Siehe Anhang).
Leider tritt dabei ein Problem auf. Bei Dateien die größer sind als ca. 220kb bekomme ich vom Debugger folgende Fehlermeldung:

"Im Projekt pSentStream.exe ist eine Exceptionder Klasse EIdSocketError aufgetreten. Meldung: 'Socket-Fehler #10053
Die Software hat den Abbruch der Verbindung verursacht.'.Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen"


Weiß jemand wodran das liegt? Ich vermute ein Problem mit dem Buffer. Aber gefunden habe ich den Fehler nicht.

Ich hoffe ihr könnt mir helfen
Gruß
Christian
Angehängte Dateien
Dateityp: rar stream_senden.rar (452,8 KB, 34x aufgerufen)
Es gibt nur 10 Typen von Menschen auf der Welt:
Die, die Binärcode verstehen und die, die es nicht tun . . .
  Mit Zitat antworten Zitat
Chris1986

Registriert seit: 17. Jul 2003
Ort: Aachen
350 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Probleme beim Versenden von Dateien mit Indy TCPClient

  Alt 27. Sep 2003, 23:24
Hat denn keiner eine Idee?

Ich bin auch offen für Vorschläge . Also, wenn jemand weiß wie ich das komplett anders viel besser machen kann, dann nur her mit euren Ideen.

Für jemanden der Angst vor Viren hat, hier noch eben der Quelltext beider Programme:

Client:
Delphi-Quellcode:
unit mSentStream;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdAntiFreezeBase, IdAntiFreeze;

type
  TSentStream = class(TForm)
    IdTCPClient1: TIdTCPClient;
    btDateisenden: TButton;
    OpenDialog1: TOpenDialog;
    edIP: TEdit;
    Label1: TLabel;
    lbPort: TLabel;
    IdAntiFreeze1: TIdAntiFreeze;
    procedure btDateisendenClick(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure Datei_senden;
  public
    { Public-Deklarationen }
  end;

var
  SentStream: TSentStream;

implementation

{$R *.dfm}

//Methode Datei_senden__________________________________________________________
procedure TSentStream.Datei_senden;
var
  fs: TFileStream;
begin
  if not OpenDialog1.Execute then exit;
  with IdTCPClient1 do
  begin
    fs:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead or fmShareDenyWrite);
    Connect;
    if Connected = true
      then WriteLn(OpenDialog1.filename) //Der Filename wird verschickt
      else Showmessage ('nicht verbunden');
    try
      OpenWriteBuffer;
      try
        WriteStream(fs, true, true, 0);
        CloseWriteBuffer;
      except
        CancelWriteBuffer;
        raise;
      end;
    finally
      Disconnect;
      fs.Free;
    end;
  end;
end;
//Ende Methode Datei_senden_____________________________________________________


//Daten-Transfer starten________________________________________________________
procedure TSentStream.btDateisendenClick(Sender: TObject);
begin
  //Der Hostname wird auf das edit-Feld edIP gesetzt
  IdTCPClient1.Host := edIp.text;
  Datei_senden;
end;
//Ende Daten-Transfer starten___________________________________________________

end.
Server:
Delphi-Quellcode:
unit mGetStream;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPServer, StdCtrls;

type
  TGetStream = class(TForm)
    IdTCPServer1: TIdTCPServer;
    SaveDialog1: TSaveDialog;
    btaktivieren: TButton;
    edPfad: TEdit;
    edFilter: TEdit;
    lbFilter: TLabel;
    lbPfad: TLabel;
    edFilename: TEdit;
    lbFilename: TLabel;
    procedure IdTCPServer1Execute(AThread: TIdPeerThread);
    procedure btaktivierenClick(Sender: TObject);
  private
    { Private-Deklarationen }
    function trueFilename (Filename :TFilename) :tFilename;
    function filter (Filename :TFilename) :string;
  public
    { Public-Deklarationen }
  end;

var
  GetStream: TGetStream;

implementation

{$R *.dfm}

//idTCPServer1 OnExecute:_______________________________________________________
procedure TGetStream.IdTCPServer1Execute(AThread: TIdPeerThread);
var
  fs: TFileStream;
  SizeOfIncomingStream: integer;
  Filename :TFilename;
begin
  //######################################
  Filename := Athread.Connection.ReadLn ;
  //trueFilename ist eine Funktion, die aus dem Pfad den Dateinamen filtert
  SaveDialog1.filename := truefilename (Filename);
  //SaveFilter ist eine Methode, um die Endung der Datei zu bestimmen
  SaveDialog1.Filter := filter (Filename);

  edPfad.text := filename;
  edFilename.text := SaveDialog1.Filename;
  edFilter.text := SaveDialog1.Filter;

  //######################################
  //Der SaveDialog wird ausgeführt und die Datei wird gespeichert.
  if not SaveDialog1.Execute then exit;
  fs := TFileStream.Create(SaveDialog1.Filename, fmCreate or fmShareExclusive);
  with AThread.Connection do
    try
      SizeOfIncomingStream := ReadInteger;
      ReadStream(fs, SizeOfIncomingStream);
    finally
      Disconnect;
      fs.Free;
    end;
end;
//Ende IdTCPServer1 OnExecute___________________________________________________


//Funktionen:___________________________________________________________________

//trueFilename ist eine Funktion, die aus dem Pfad den Dateinamen filtert
function TGetStream.trueFilename(Filename :TFilename):tFilename;
var backslash :boolean;
    i :integer;
begin
  i := 0;
  backslash := false;
  //Der Dateiname ohne Pfaangabe wird gefilter
  while backslash= false do
  begin
    if copy (Filename,length (Filename)-i,1) = '\'
      then begin
             trueFilename := copy (Filename,length (Filename)-i+1,i);
             backslash := true
           end
      else i := i+1;
  end;
end;

//Filter ist eine Funktion die im Filename nach der Endung sucht
function TGetStream.Filter (Filename :TFilename) :string;
var dot :boolean;
    i :integer;
begin
  i:= 0;
  dot := false;
  while dot= false do
  begin
    if copy (Filename,length (Filename)-i,1) = '.'
      then begin
             filter := '*.'+copy (Filename,length (Filename)-i+1,i)+
                       '|'+copy (Filename,length (Filename)-i+1,i);
             dot := true
           end
      else i := i+1;
  end;
end;
//Ende der Funktionen___________________________________________________________


//Serverstart:__________________________________________________________________
procedure TGetStream.btaktivierenClick(Sender: TObject);
begin
  if btaktivieren.Caption = 'Server aktivieren'
    then begin
           idtcpServer1.active := true;
           showmessage ('Dienst gestartet');
           btaktivieren.Caption := 'Server deaktivieren'
         end
    else begin
           idtcpServer1.active := false;
           btaktivieren.Caption := 'Server aktivieren'
         end;
end;
//Ende Serverstart______________________________________________________________
end.
Gruß
Christian
Es gibt nur 10 Typen von Menschen auf der Welt:
Die, die Binärcode verstehen und die, die es nicht tun . . .
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#3

Re: Probleme beim Versenden von Dateien mit Indy TCPClient

  Alt 28. Sep 2003, 00:01
Hi Chris,

ich sehe in Deiner Vorgehensweise ein paar Probleme !!!

Was soll das Programm den später genau können ?

Warum schickst Du den Kompletten Datei-Pfad mit ?

Der Client kann im Prinzip so bleiben, nur würde ich mir überlegen, ob Du wirklich den kompletten Pfad mitschicken willst/musst.

Zum Server :

Du verwendest die WriteStream-Funktion so, dass die Stream Grösse mitgeschickt wird.

Beim Lesen des Streams versuchst Du selber die Grösse des Streams auszulesen, das must Du gar nicht, das macht die ReadStream-Funktion :

Schreib es mal einfach so : ReadStream(ms);

Das sollte der Grund für Deinen Fehler sein, habe den Fehler früher selbst so gehabt

Ein weiterer Gedankenfehler ist, dass der Server Multi-Threaded ist und Du in der Execute-Methode einen Modualen Dialog(Save) ausführst.
Was passiert wenn zwei Clients Daten gleichzeitig senden ?
Was passiert, wenn niemand den SaveDialog bestätigt ?
Dann gibt es einen Timeout und dein Progg stürzt ab !!!

Ich kann Dir gern ein paar mehr Tipps geben, habe mich im letzen Jahr sehe intensiv mit Indy beschäftigt, vor allen Dingen mit IdTcpClient u. IdTcpServer

Gruß Data
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Chris1986

Registriert seit: 17. Jul 2003
Ort: Aachen
350 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Probleme beim Versenden von Dateien mit Indy TCPClient

  Alt 28. Sep 2003, 00:11
Hi Datacool
Also, wenn du noch ein paar Tipps für mich hättest wäre das prima. Ich hab nämlich schon viel im Forum gestöbert und bin dabei oft auf die gleichen Probleme gestoßen. (Z.B. "onwork" funktioniert nicht richtig ect.).

Das Programm ist eigentlich mehr so eine Art Übung, um mal zu sehen was man mit den Indys so alles anstellen kann. Der meiste Quelltext ist aus der Code-Library und auf die Funktionen, die den Pfad zerpflücken war ich eigentlich ein bisschen stolz

Was hast du mit den Indys denn schon alles gemacht? Ich scheitere z.B. auch kläglich an dem Programmieren einer Statusbar, um zu sehen wieviel von der Datei schon empfangen/versendet wurde.

Hast du vielleicht ein kleines Beispiel-Programm für mich, wo du so einen Datentransfer schon sauber gelöst hast?

Edit:
Ich habe gerade mal probiert statt ReadStream(fs, SizeOfIncomingStream) einfach ReadStream(fs) zu benutzen. Leider funktioniert es nicht. Der Savedialog öffnet sich noch, aber wenn ich speichern will gibt es einen Fehler im Server.

Was ich vergessen habe zu erwähnen:
Der Fehler den ich oben beschrieben habe ensteht im Client, wenn ich den Client in Delphi bearbeite.
Starte ich die *.exe ohne Delphi kommt folgender Fehler:
"Socket-Fehler # 10053.
Die Software hat den Abbruch der Verbindung verursacht"


MfG
Christian
Es gibt nur 10 Typen von Menschen auf der Welt:
Die, die Binärcode verstehen und die, die es nicht tun . . .
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#5

Re: Probleme beim Versenden von Dateien mit Indy TCPClient

  Alt 28. Sep 2003, 00:21
Hi Chris,

mein Hauptprojekt mit den Indys ist ein neuer Messanger, komplett in Delphi mit Indy !

Es ist ein Chat, telefonieren u. Cam2Cam möglich !

Das ganze ist auch schon online www.telwell.de

Aber ich benutze die Indy-Komponenten z.B. auch bei einer Anwendung im Gastronomie Bereich, wo es eine grosse Cafe-Kette gibt die in über 50 Standorten ein Programm von mir einsetzt, wo jeder eine lokele Firebird Datenbank hat.

Diese 50 Datenbanken der einzelnen Standorte werden per Indy zur Zentrale übertragen und zu einer Main-DB Syncronisiert.

DAmit in der Zentrale Reporting usw. durchgeführt werden können.
Da arbeite ich auch mit einer Fortschrittsanzeige beim Übertragen der DB

Wo kann ich Dir denn jetzt konkret helfen ?

Data
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Chris1986

Registriert seit: 17. Jul 2003
Ort: Aachen
350 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Probleme beim Versenden von Dateien mit Indy TCPClient

  Alt 28. Sep 2003, 00:30
Also,
ich habe oben meinen Thread nochmal editiert.
Kannst du mir vielleicht den Code-Schnipsel zeigen, der die Datenbank verschickt und den Code der sie empfängt? Du wirst ja wahrscheinlich auch eine Datei versenden. Oder versendest du die Tabelle mit Strings? Wahrscheinlich nicht. (Das wäre so meine erste Idee, Daten zu übermitteln )

Ich will nur wissen wie man sowas sinnvoll angeht und was ich tun muss, um Dateien zu versenden die beliebig groß sind. Ausserdem bin ich durch das Konzept der IdTCPClient Kompo noch nicht so ganz durchgestiegen. Warum braucht man Buffer? Und warum auch noch 2?

Gruß
Christian
Es gibt nur 10 Typen von Menschen auf der Welt:
Die, die Binärcode verstehen und die, die es nicht tun . . .
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#7

Re: Probleme beim Versenden von Dateien mit Indy TCPClient

  Alt 28. Sep 2003, 01:07
Hi Chris,

ICQ hast Du nicht oder ? Lad Dir mal mein TelWell runter Habe Nummer 1011

Wie kommst Du jetzt darauf das man zwei Buffer braucht ?

Dein Code war schon soweit ganz ok, nur denn SaveDialog raus und das ReadInteger weglassen und dann nur readstream verwenden

Schicke Dir morgen mal ein Code Bsp.


Gruß Data
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Chris1986

Registriert seit: 17. Jul 2003
Ort: Aachen
350 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Probleme beim Versenden von Dateien mit Indy TCPClient

  Alt 28. Sep 2003, 10:08
So,
ich bin jetzt online bei TelWell. Meine Nummer: 3831. Nur du bist noch nicht da

Edit:
Achja, was ich mit den 2Buffern meinte waren die Eigenschaften des idTCPClients im Objektinspektor.
Da steht nämlich "RecvBufferSize" und "SendBufferSize".

Wie meinst du das eigentlich mit der Readstream-Methode?
ICQ hab ich auch: 251840671

Gruß
Christian
Es gibt nur 10 Typen von Menschen auf der Welt:
Die, die Binärcode verstehen und die, die es nicht tun . . .
  Mit Zitat antworten Zitat
ATwardz

Registriert seit: 12. Mai 2003
205 Beiträge
 
Delphi 7 Professional
 
#9

Re: Probleme beim Versenden von Dateien mit Indy TCPClient

  Alt 1. Okt 2003, 14:17
Hi,
mich quält ebenfalls das Problem der zu grossen Datenmenge und der nicht funktionierenden
onwork Methode!
Das den Anzeigen wurde ich nicht so recht schlau und der Teil mit der Fortschrittsanzeige
fehlt komplett.

Wäre sehr dankbar wenn die Lösung des Problems nochmals angezeigt wird:ALSO WAS ICH ÄNDERN
MUSS AM BEISPIELCODE!

DANKE @wardz
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#10

Re: Probleme beim Versenden von Dateien mit Indy TCPClient

  Alt 1. Okt 2003, 14:27
Hi ATwardz,

ich habe für Chris ein kleines Demo geschrieben, wo Client und Server enthalten sind.
Das Programm verschickt Dateien beliebiger Grösse, auf dem Server ist eine Fortschrittsanzeige schon fertig implementiert, beim Client bin ich dazu noch nicht gekommen.

Werde den Quellcode gleich mal hochladen !

Gruß Data
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 20:23 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