![]() |
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 |
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 |
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:
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: |
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:
Vielleicht noch das Disconnect:
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;
Delphi-Quellcode:
Die AddProt-Proceduren sind nicht schuld. Die kann ich auskommentieren und es passiert das gleiche.
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; Irgendwas scheint beim Senden der Datei "kaputt" zu gegen :gruebel: Ich weiß nicht weiter :cry: |
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 |
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 06:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz