Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy 9 Datei vom Server zum Client senden (https://www.delphipraxis.net/109426-indy-9-datei-vom-server-zum-client-senden.html)

gmc616 1. Mär 2008 02:13


Indy 9 Datei vom Server zum Client senden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ai Gude liebe DP-Gemeinde.

Ich möchte eine Datei von einem IdTcpServer zu einem IdTcpClient übertragen.
Dazu soll sich der Client am Server anmelden, auf Knopfdruck die Datei anfordern und der Server soll auf der gleichen Connection die Datei übertragen.
Das klappt so weit ganz gut.

Wenn allerdings eine Datei übertragen wurde, der Client sich vom Server abmeldet und sich erneut verbindet, klappt das Connect am Server nicht mehr, oder der Server empfängt keine Daten mehr vom Client.

Sind zwei Clients angemeldet, bekommt nur ein Client die angeforderte Datei. Der andere nicht, je nach dem welcher als erstes die Datei gesendet bekommen hat.

Woran liegt das?

Ich weiß, dass das eine sehr allgemeine Frage zu einem sehr komplexem Problem ist, deswegen häng ich einfach mal das Demo-Projekt als Source mit ran.

Vielleicht könnt ihr mal rein schauen, es so anpassen das es funktioniert, oder mir erklären was ich falsch mache bzw. warum das Ganze nicht funktioniert.

Das Ganze basiert auf Indy9 unter BDS2006.

Danke und Grüße
gmc

rollstuhlfahrer 1. Mär 2008 07:23

Re: Indy 9 Datei vom Server zum Client senden
 
HI gmc616,
bei mir funkuioniert das Demo-Programm nicht. Die Datei wird nicht richtig übertragen...
Die erste Frage, die bei mir auftrat ist: Warum verwendest du einen Thread?? IN der Clientprocedure Button1Click kannst du doch schon die kommunikation mit dem server auswerten... Außerdem hatte ich noch nie Probleme, dass ein Stream so groß war, dass man ihn nicht auf ein mal durch Athread.connection.sendstream() schicken konnte.das dürfte dein Programm etwas komplizierter machen.
Sonst sieht dein Progrämmchen schon ganz gut aus


rollstuhlfahrer

gmc616 4. Mär 2008 00:45

Re: Indy 9 Datei vom Server zum Client senden
 
Wah! :shock: Die Datei kommt nicht korrekt an!?
Hatte das Ganze bis jetzt testweise mit nem JPG und nem XML probiert, das sah nach der Übertragung immer noch korrekt aus bzw hat funktioniert. Da werd ich wohl noch mal reinkucken müssen.

Zitat:

Zitat von rollstuhlfahrer
Warum verwendest du einen Thread?? IN der Clientprocedure Button1Click kannst du doch schon die kommunikation mit dem server auswerten...

Warum nicht?
Der Client soll später auch ohne Anfrage Daten vom Server empfangen können.
Ich denke die Lösung mit dem Thread ist da nicht verkehrt, oder?

Danke fürs Reinkucken, nur hilft mir das nicht wirklich weiter. :?

Das Problem ist immer noch, dass nach dem Übertragen eines Files, ein "Reconnect" vom Client zum Server nicht mehr funktioniert. Könnten da noch "vergessene" Bytes den Server blockieren? :gruebel:

gmc616 5. Mär 2008 10:49

Re: Indy 9 Datei vom Server zum Client senden
 
Ich habe die Problemstelle näher einkreisen können.
Beim ersten Connect -> Datei übertragen -> Disconnect funktioniert augenscheinlich alles ohne Probleme.
Erst beim zweiten Connect "läuft" die ServerConnect-Procedure nicht durch.
Delphi-Quellcode:
procedure TForm1.TcpServerConnect(AThread: TIdPeerThread);
var
  NewClient : PClient;
begin
  GetMem(NewClient, SizeOf(TClient));
 
  NewClient.DNS        := AThread.Connection.Socket.Binding.PeerIP;
  NewClient.Connected  := Now;
  NewClient.LastAction := NewClient.Connected;
  NewClient.Thread     :=AThread;
 
  AddProt ('Connect : "'+NewClient.DNS+'"');

  AThread.Data:=TObject(NewClient);
 
  try
    Clients.LockList.Add(NewClient); // <- hier ist schluß
    AddProt ('Connect in LockListe.');
  finally
    Clients.UnlockList;
  end;

  AddProt ('Connect : fertig');
end;
Vielleicht noch das Disconnect:
Delphi-Quellcode:
procedure TForm1.TcpServerDisconnect(AThread: TIdPeerThread);
var
  ActClient: PClient;
begin
  ActClient := PClient(AThread.Data);
  AddProt ('Disconnect : "'+ActClient^.DNS+'"');
 
  try
    Clients.LockList.Remove(ActClient);
    AddProt ('DisConnect aus lockliste');
  finally
    Clients.UnlockList;
  end;

  FreeMem(ActClient);

  AThread.Data := nil;
  AddProt ('Disconnect : fertig');
end;
Die AddProt-Proceduren sind nicht schuld. Die kann ich auskommentieren und es passiert das gleiche.

Irgendwas scheint beim Senden der Datei "kaputt" zu gegen :gruebel:

Ich weiß nicht weiter :cry:

gmc616 6. Mär 2008 20:56

Re: Indy 9 Datei vom Server zum Client senden
 
Bin ich bekloppt?
Funktioniert mein Demo-Problem-Projekt bei euch, oder warum kann mir keiner helfen?

Außer dem rollstuhlfahrer scheint sich nur ein Weiterer die Mühe zu machen, sich überhaupt mal das Demo anzuschauen.
Ich dachte die DP ist das Forum, in dem man Hilfe bekommt!?

Bin ich der Einzigste der versucht von einem IdTcpServer zum IdTcpClient Dateien zu versenden?

Eine Antwort wie: "Hey, das geht nicht, weil ..."
oder "Dein Fehler ist ..."
oder "Du Rindvieh ... !"
... hätte ich doch schon irgendwie erwartet.

Enttäuschte Grüße :pale:
gmc

Softchaos67 12. Mär 2008 08:08

Re: Indy 9 Datei vom Server zum Client senden
 
Hallo,
ich habe mir deinen Server mal angeschaut.
Ich habe die Execute Methode nicht verstanden. Warum bildest du die Locklist und itterierst über die verbundenen Clients?
In AThread steht doch schon der Empfänger fest.
Eigentlich brauchst du doch nur das command auswerten (aus deinem CommunicationRecord) und die Antwort an AThread senden, oder?
Gruss Matthias
ps: ich kann das programm nicht compilieren da ich schon indy10 verwende


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