![]() |
Dialog mit einem Server über Indy TCP
Hallo,
ich bin nun schon den ganzen Tag auf der Suche nach einem vernünftigen Beispiel das es mir ermöglicht mit der Indy TCP Komponente eine Verbindung zu einem Server aufzubauen, die Antworten (mehrzeilig) auszuwerten und entsprechend zu antworten. Ich habe mich dazu durch unterschiedliche Foren gelesen und mir unterschiedliche Beispiele angeschaut, allerdings war für mich als Anfänger nie etwas dabei oder die Probleme die sich auch bei mir auftaten wurden in den Threads nicht beantwortet. Auch die Indy Webseite war kaum hilfreich und mit Google bin ich auch nicht fündig geworden. Bisher habe ich mit folgendem Beispiel herrumexperimentiert:
Code:
Allerdings war es mir hierbei nur möglich die erste Zeile
program Intro;
{$APPTYPE CONSOLE} uses IdTCPClient, SysUtils; var test: string; begin with TIdTCPClient.Create do try Host := 'www.google.com'; Port := 80; Connect; try IOHandler.WriteLn('GET / HTTP/1.0'+#13#10); test := IOHandler.ReadLn; WriteLn(IntToStr(pos('200',test))); WriteLn(test); finally Disconnect; end; WriteLn('Disconnected.'); finally Free; end; WriteLn('Press Enter'); ReadLn; end. mit ReadLn der Antwort des Servers auszuwerten. Eine Schleife die hier nun ständig ReadLn aufruft ist sicherlich nicht die beste Lösung. Ich wäre Euch sehr dankbar wenn Jemand ein kleines Beispiel Projekt erstellt das variabel auf die Antworten des Servers reagieren kann. Da ich wie gesagt erst ein paar Tagen mit Delphi arbeite wäre ein Beispiel-code zum nachvollziehen sehr hilfreich. |
Re: Dialog mit einem Server über Indy TCP
Herzlich willkommen!
1. Ich schätze mal, du benutzt die 8er Version von Indy; mein Tip: nimm die 9er. 2. Muss es wirklich ein Konsolenprogramm sein? Indy benutzt nämlich Threads und die in einem Konsolenprogramm umzusetzen ist schon ziemlich haarig. 3. Wenn's was mit HTTP zu tun hat, dann nimm die Komponente TIdHTTP. 4. Für mehrzeilige Texte gibt's die Funktion ReadStrings (erst ab Version 9, glaub ich), klappt aber in deinem Beispiel nicht. 5. In deinem Beispiel ist die Schleifenvariante wahrscheinlich die beste Lösung (nix anderes macht im Grunde genommen ReadStrings...). Also:
Delphi-Quellcode:
program Konsole;
{$APPTYPE CONSOLE} uses Classes, IdTCPClient, SysUtils; var test: string; Client: TIdTCPClient; begin Client := TIdTCPClient.Create(nil); try Client.Host := 'www.google.com'; Client.Port := 80; Client.Connect; try Client.WriteLn('GET / HTTP/1.0'+#13#10); repeat test := Client.ReadLn(#$A, 50); if test <> '' then begin WriteLn(test); WriteLn(IntToStr(pos('200',test))); end; until test = ''; finally Client.Disconnect; end; WriteLn('Disconnected.'); finally FreeAndNil(Client); end; WriteLn('Press Enter'); ReadLn; end. |
Re: Dialog mit einem Server über Indy TCP
Hallo =),
danke für deine Antwort und das Beispiel, allerdings erhalte ich beim ausführen die Fehler: Zitat:
Zitat:
Zitat:
nun schon den 3ten Tag nach einem halbwegs verständlichen Beispiel das mir zeigt wie ich mit einem entsprechenden Error Handling eine Tcp Verbindung über unterschiedliche Threads aufbauen kann. Um dann in der Lage zu sein unterschiedliche Antworten vom Server aufzuwerten und entsprechend zu reagieren. Was ich in diesen 3 Tagen allerdings nur feststellen konnte das egal wo ich gesucht habe immer wieder auf die Indy Webseiten verwiesen wird die nach meinem dafürhalten mehr schlecht als recht kommentiert sind. Als Anfänger ist man dort verloren. Auch die oft angepriesenen Demos bringen mich kein Stück vorwärts. Zitat:
zu verstehen. Http soll dann später nichts mehr damit zu tun haben. Zitat:
wie ReadFromStack und ReadBuffer oder ähnliches gelesen. Allerdings wie immer ohne Beispiel. Die Delphi Hilfe ist gerade für Anfänger schwer nachzuvollziehn. Zitat:
gleichzeitige Verbindungen etablieren. Könnten Schleifen hier nicht zum einfrieren des Programmes oder zur hohen Systemauslastung führen? Mfg |
Re: Dialog mit einem Server über Indy TCP
Au weia, als Anfänger gleich die 10er-(Beta)Version?
Da wirst du nicht viele finden, die die schon benutzen und sich damit auskennen, nimm lieber - ich wiederhol mich, ich weiß - die 9er! (Daher diese Sache mit dem IOHandler... :gruebel:) Hast du denn die einfachen Tutorials über Indy, wie z.B. bei ![]() Guck die immer an, wie die (Read)-Funktionen arbeiten, z.B. liest ReadStrings bei der Angabe von -1 bei Zeilenanzahl erst mit ReadInteger die Anzahl der Zeilen ein, wenn aber die Anzahl gar nicht drinsteht, werden die ersten Zeichen als Integer umgewandelt und du bekommst ne falsche Angabe der Zeilen, aber das nur nebenbei... Ja, bei ner Thread-Version sind so Schleifen natürlich Mist, ganz klar! |
Re: Dialog mit einem Server über Indy TCP
Du kannst mir glauben das ich mich wirklich schon durch
alles durchgewühlt habe was mir unter die Finger gekommen ist. Auch durch dieses Forum. Aber speziell für eine deartige Aufgabe war bisher nichts dabei. Es ging dabei steht nur um Emails versenden oder Dateiuploads. Das Problem dann bei solchen Scripten ist dann für mich das ich keine Ahnung wie ich diese entsprechend umbauen sollte. Zumal diese sowieso einen anderen Ansatz verfolgen. Die 10er habe ich mir nur installiert weil ich nicht davon ausgegangen bin das es sich hier um eine deartige Veränderung handelt. Auch habe ich gehofft mit der 10er einige brauchbare Beispiele frei Haus zu bekommen, dem war allerdings nicht so. Ein Umstieg auf die 9er sollte kein Problem darstellen. Das Ganze ist für mich als alten PHP Freak sehr frustierend. Ich bin nicht davon ausgegangen das Delphi derart schlecht kommentiert ist und es so wenige Tutorials dafür gibt. |
Re: Dialog mit einem Server über Indy TCP
Zitat:
Delphi7? ... Ist da nicht Indy8 dabei? ... und Demos? ... :gruebel: |
Re: Dialog mit einem Server über Indy TCP
Zitat:
Delphi7/Demos/Indy nur eine Text-Datei mit einem Link zu den Indy Webseiten zu finden, ich werd das ganze nun nochmal mit der 9er Version probieren, bin da allerdings wenig zuversichtlich |
Re: Dialog mit einem Server über Indy TCP
Zitat:
![]() |
Re: Dialog mit einem Server über Indy TCP
oh danke für den link, diese sammlung an demos kannte ich nun noch nicht,
was mich bei dem aufbau der seite allerdings auch nicht verwundert ich hab nun mit dem beispiel aus /BasicClientServer/Client rumprobiert, das verbinden zu meinem pop3 server z.b. macht hier nun kein problem, aber wenn ich versuche zu einem proxy server zu verbinden oder zu einem http server oder einem chatserver dann streigt die demo völlig, laut meinem packetsniffer wird die verbindung zum Server zwar geöffnet, aber es werden keine wirklichen Daten übertragen
Code:
Das WriteLn('test'); wird z.B. gar nicht mehr gesendet, auch scheint
procedure TfrmMain.btnConnectClick(Sender: TObject);
var LString : String; begin lbCommunication.Items.Clear; with IdTCPClient do begin Host := edtHost.Text; Port := StrToint(edtPort.Text); try Connect; // add a timeout here if you wish, eg: Connect(3000) = timeout after 3 seconds. WriteLn('test'); btnConnect.Enabled := false; btnDisconnect.Enabled := true; except on E : Exception do begin LockControls(True); ShowMessage(E.Message); end; end; end; end; das Programm gar nicht zu realisieren das es überhaupt verbunden ist. So werden die Buttons Connect/Disconnect auch nicht de/aktiviert. Das Problem scheint also bei try Connect zu liegen. Kann ich ehrlich gesagt nicht wirklich nachvollziehen. Ein PHP Script das ich zum Verbinden der selben Server nutze funktioniert ohne Probleme. |
Re: Dialog mit einem Server über Indy TCP
Zitat:
Der Source ist richtig (was macht LockControls?) und funktioniert bei mir. Womit verbindest du dich denn? Schonmal durchgesteppt, um zu sehen, wo der Fehler liegt? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:04 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