AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Indy 9 Datei vom Server zum Client senden
Thema durchsuchen
Ansicht
Themen-Optionen

Indy 9 Datei vom Server zum Client senden

Offene Frage von "gmc616"
Ein Thema von gmc616 · begonnen am 1. Mär 2008 · letzter Beitrag vom 12. Mär 2008
Antwort Antwort
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#1

Indy 9 Datei vom Server zum Client senden

  Alt 1. Mär 2008, 02:13
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
Angehängte Dateien
Dateityp: zip server2client_520.zip (6,0 KB, 25x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#2

Re: Indy 9 Datei vom Server zum Client senden

  Alt 1. Mär 2008, 07:23
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
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#3

Re: Indy 9 Datei vom Server zum Client senden

  Alt 4. Mär 2008, 00:45
Wah! 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 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?
  Mit Zitat antworten Zitat
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#4

Re: Indy 9 Datei vom Server zum Client senden

  Alt 5. Mär 2008, 10:49
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

Ich weiß nicht weiter
  Mit Zitat antworten Zitat
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#5

Re: Indy 9 Datei vom Server zum Client senden

  Alt 6. Mär 2008, 20:56
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
gmc
  Mit Zitat antworten Zitat
Softchaos67

Registriert seit: 23. Jul 2004
39 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Indy 9 Datei vom Server zum Client senden

  Alt 12. Mär 2008, 08:08
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
irgendwie gehts.....
  Mit Zitat antworten Zitat
Antwort Antwort


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:43 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