AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Dialog mit einem Server über Indy TCP
Thema durchsuchen
Ansicht
Themen-Optionen

Dialog mit einem Server über Indy TCP

Ein Thema von endeffects · begonnen am 27. Jun 2004 · letzter Beitrag vom 29. Jun 2004
Antwort Antwort
Seite 1 von 2  1 2      
endeffects

Registriert seit: 27. Jun 2004
450 Beiträge
 
#1

Dialog mit einem Server über Indy TCP

  Alt 27. Jun 2004, 17:30
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:
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.
Allerdings war es mir hierbei nur möglich die erste Zeile
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.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

Re: Dialog mit einem Server über Indy TCP

  Alt 28. Jun 2004, 07:52
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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
endeffects

Registriert seit: 27. Jun 2004
450 Beiträge
 
#3

Re: Dialog mit einem Server über Indy TCP

  Alt 28. Jun 2004, 08:42
Hallo =),

danke für deine Antwort und das Beispiel,
allerdings erhalte ich beim ausführen die Fehler:

Zitat:
[Fehler] Intro.dpr(20): Undefinierter Bezeichner: 'WriteLn'
[Fehler] Intro.dpr(22): Undefinierter Bezeichner: 'ReadLn'
Zitat:
1. Ich schätze mal, du benutzt die 8er Version von Indy; mein Tip: nimm die 9er.
Nein ich benutzt die 10er Indy auf Delphi 7.0.

Zitat:
2. Muss es wirklich ein Konsolenprogramm sein? Indy benutzt nämlich Threads und die
in einem Konsolenprogramm umzusetzen ist schon ziemlich haarig.
Nein natürlich nicht, mir wäre ein Programm mit GUI viel lieber, allerdings suche ich
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:
3. Wenn's was mit HTTP zu tun hat, dann nimm die Komponente TIdHTTP.
Das war nur ein simples Beispiel um halbwegs den Aufbau von TIdTCPClient
zu verstehen. Http soll dann später nichts mehr damit zu tun haben.

Zitat:
4. Für mehrzeilige Texte gibt's die Funktion ReadStrings (erst ab Version 9, glaub ich), klappt aber in deinem Beispiel nicht.
Offensichtlich führen viele Wege nach Rom. Ich hab auch schon von Möglichkeiten
wie ReadFromStack und ReadBuffer oder ähnliches gelesen. Allerdings wie
immer ohne Beispiel. Die Delphi Hilfe ist gerade für Anfänger schwer nachzuvollziehn.

Zitat:
5. In deinem Beispiel ist die Schleifenvariante wahrscheinlich die beste Lösung (nix anderes macht im Grunde genommen ReadStrings...).
Ich möchte das ganze später wie gesagt über Threads laufen lassen und somit mehrere
gleichzeitige Verbindungen etablieren. Könnten Schleifen hier nicht zum einfrieren
des Programmes oder zur hohen Systemauslastung führen?


Mfg
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

Re: Dialog mit einem Server über Indy TCP

  Alt 28. Jun 2004, 08:53
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... )

Hast du denn die einfachen Tutorials über Indy, wie z.B. bei Delphi-Source durch? (Ok, die benutzen die 8er, aber das dürfte nicht schwierig sein, auf die 9er umzusetzen.)

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!
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
endeffects

Registriert seit: 27. Jun 2004
450 Beiträge
 
#5

Re: Dialog mit einem Server über Indy TCP

  Alt 28. Jun 2004, 09:02
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.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

Re: Dialog mit einem Server über Indy TCP

  Alt 28. Jun 2004, 09:10
Zitat von endeffects:
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.
Anscheinend schon. Aber bei der 9er sind einige Beispiele dabei. (Ist aber ein Extra-Download!!!)

Delphi7? ... Ist da nicht Indy8 dabei? ... und Demos? ...
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
endeffects

Registriert seit: 27. Jun 2004
450 Beiträge
 
#7

Re: Dialog mit einem Server über Indy TCP

  Alt 28. Jun 2004, 09:17
Zitat:
Delphi7? ... Ist da nicht Indy8 dabei? ... und Demos? ...
Vielleicht bin ich auch schon verwirrt, auf jeden Fall war unter
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
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#8

Re: Dialog mit einem Server über Indy TCP

  Alt 28. Jun 2004, 09:22
Zitat von endeffects:
bin da allerdings wenig zuversichtlich
Ach was! Guckst du hier nach den Demos! (ganz unten, der letzte Link)
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
endeffects

Registriert seit: 27. Jun 2004
450 Beiträge
 
#9

Re: Dialog mit einem Server über Indy TCP

  Alt 28. Jun 2004, 11:04
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:
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 WriteLn('test'); wird z.B. gar nicht mehr gesendet, auch scheint
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.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#10

Re: Dialog mit einem Server über Indy TCP

  Alt 28. Jun 2004, 11:45
Zitat von endeffects:
was mich bei dem aufbau der seite allerdings auch nicht verwundert
Ok, es ist kein Wunderwerk, aber was ist denn an der Seite nicht zu verstehen!?

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?
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 03:47 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