AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi Einsteigertutorial: Indy 10 nutzen
Tutorial durchsuchen
Ansicht
Themen-Optionen

Einsteigertutorial: Indy 10 nutzen

Ein Tutorial von halinchen · begonnen am 14. Dez 2007 · letzter Beitrag vom 30. Jun 2010
Antwort Antwort
Benutzerbild von halinchen
halinchen
Registriert seit: 13. Jun 2006
Hallo.

In meinem ersten Tutorial möchte ich auf die einfache Nutzung der Indy-Komponeten eingehen.
Ich möchte hier vorallem auf die TCP/IP-Komponenten der Indys eingehen. (TidTCPServer + TidTCPClient).

Installation
Zuerst einmal müssen sie installiert werden.
Die Installation wird hier von Matze beschrieben. Wer keine Personalversion von Delphi hat, der kann Schritt 2 weglassen.

Benutzen der Komponenten
Ich möchte zwei Programme schreiben, so das der Client und der Server getrennt sind.
Als Protokoll nutze ich TCP/IP, da es sehr oft verwendet wird.

Der Server
Ein Server ist ein (Teil-)Programm, welches Daten empfängt.
Man nehme also ein neues Programm und zieht sich eine Komponente TidTCPServer (Palette "Indy Server") auf das Formular.
Nun müssen folgende Werte im Objektinspector geändert werden:

Name = TCPServer
DefaultPort = 50000;
Active = true

DefaultPort gibt an, an welchem Port der Server "lauschen" soll.
Man kann sich also einen Port wie eine Steckdose am Rechner vorstellen. Hinter der Dose ist unser Server. Sobald sich ein Client mit unserem Computer verbindet gibt er einen Port an. Wenn der Port der von unserem Server ist, wird er mit unserem Server kommunizieren. Normalerweise kann ein Port nur von einem Server belegt werden.

Active gibt an, ob der Server aktiviert ist. Bei Active=true beginnt der Server direkt nach dem Start des Programmes sein Arbeit.

Weiterhin benötigen wir noch ein Memo. In folgenden Text ist es Memo1 benannt.
Nun muss man auf unseren Server mit der Maus auswählen und im Objektinspector auf Ereignisse klicken. Wir belegen OnExecute mit folgendem Code:
Memo1.Lines.Add('Nachricht: ' + AContext.Connection.IOHandler.ReadLn); Wir belegen OnConnect mit folgendem Code:
Memo1.Lines.Add('Verbindung: ' + AContext.Binding.PeerIP); Wir belegen OnDisconnect mit folgendem Code:
Memo1.Lines.Add('Verbindungsabbruch: ' + AContext.Binding.PeerIP); Somit wäre unser Server schon fertig.
Bei einer neuen Verbindung oder einem Verbindungsabbruch gibt uns das Programm die IP des Clienten aus.
OnExecute wird ausgelöst, sobald ein Client etwas "schreibt". Alle Lese- und Schreibroutinen finden wir in der Eigenschaft der Connection "IOHandler".
Das AContext-Objekt bekommt mal direkt als Parameter übergeben.
Wenn man den Code nicht kompilieren kann, da ein Objekt "TIdContext" fehlt, muss man nach ganz oben scrollen und hinter die letzte uses-Anweisung (aber vor das ";"!) ein ", idContext" schreiben.

Nun das Projekt compilieren und erstellen.

Der Client
Der Client ist ein (Teil-)Programm, welches Daten sendet. Ein Client verbindet sich immer mit dem Server. Ein Server kann keine Verbindung zu einem Clienten herstellen. (In einem Programm wäre das möglich, sobald das Programm einen Server und einen Clienten bereitstellt.)

Wir legen ein neues Projekt an. (Möglichst das alte speichern, das brauchen wir ja noch ).
Nun ziehen wir einen Button (Palette "Standard") und einen TidTCPClient (Palette "Indy Clients") auf das Formular.
Beim dem TidTCPClienten stellen wir im Objektinspector folgendes ein:

Name : TCPClient
Port: 50000 (muss der selbe sein wie DefaultPort beim Server)
Bei Host gibt es mehrere Möglichkeiten:
a) Das Serverprogramm soll auf dem selben Rechner laufen wie der Client: Host = localhost
b) Das Serverprogramm soll auf einem anderen Rechner laufen wie der Client: Host = <IP oder Name des Serverrechners>

Nun zum Button: Bei dem Ereigniss OnClick schreiben wir folgendes rein:
Delphi-Quellcode:
TCPClient.Connect;
  if TCPClient.Connected then begin
    TCPClient.IOHandler.WriteLn('Dies ist eine Nachricht vom Clienten.');
    TCPClient.Disconnect;
  end;
Nun das Projekt compilieren und erstellen.


Test der beiden Programme
Nun starten wir als ersten das Programm des Servers.
Bei einer eventuelle Meldung der Firewall sollten wir dem Programm erlauben den Port zu belauschen.

Jetzt noch das Programm des Clienten starten und auf den Button klicken.
Im Server sollten 3 Einträge im Memo erscheinen.

Man sieht also, das beim Connecten OnConnect, beim Senden von Nachrichten OnExecute und beim Disconnecten OnDisconnect aufgerufen wird.


Im Anhang sind noch die Beispielprogramme.
Angehängte Dateien
Dateityp: zip indy-tutorial_121.zip (536,2 KB, 1006x aufgerufen)
 
elcomportal

 
Delphi 5 Standard
 
#2
  Alt 16. Okt 2009, 17:24
Hi,
kurze Frage.
Wie kann ich den Server (!) dazu bewegen, dem Client Daten zurückzuschicken?
Mfg und Danke
Torsten
  Mit Zitat antworten Zitat
Klaus01

 
Delphi 10.4 Sydney
 
#3
  Alt 16. Okt 2009, 17:34
Guten Abend,

wenn der Server eine Nachricht erhält wird onExecute ausgeführt.
Hier kann dann auch auf die Nachricht reagiert werden.
Mit AContext.Connections.IOHandler.WriteLn('Antwort');
wird eine Nachricht an den Client geschickt.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
elcomportal

 
Delphi 5 Standard
 
#4
  Alt 16. Okt 2009, 17:40
Danke für die schnelle Antwort.
Ich bekomme da die Fehlermeldung undeklarierter Bezeichner 'Connections'
Warum das denn?
Mfg
Torsten
  Mit Zitat antworten Zitat
Klaus01

 
Delphi 10.4 Sydney
 
#5
  Alt 16. Okt 2009, 17:45
.. weil ich die Antwort geschrieben habe ohne es zu testen.
Du kannst ja mal AContext. eintippen und sehen was Dir da so angeboten wird.
Derweil will ich mal mein Delphi starten.

Richtig ist es so: AContext.Connection.IOHandler.WriteLn('Antwort');

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
elcomportal

 
Delphi 5 Standard
 
#6
  Alt 16. Okt 2009, 17:48
Hatte es auch gerade gefunden...
connections -> connection
Dann gehts.
Aber ich kriege noch 'ne Exception. Mal sehen warum... (Socket Error 10054)
Vielen Dank.
Mfg
Torsten
  Mit Zitat antworten Zitat
therowe

 
FreePascal / Lazarus
 
#7
  Alt 9. Jan 2010, 21:00
Also das Thema ist zwar schon etwas alt, jedoch hätte ich noch eine Frage dazu: Die Server Datei giebt mir im Onexecute mit AContext.Connection.IOHandler.WriteLn('Antwort');
eine Antwort zum client, doch wie kann ich diese jetzt im Client auf einer Memo anzeigen lassen?
Danke schonmal im Vorraus
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry

 
Delphi 2006 Professional
 
#8
  Alt 9. Jan 2010, 21:08
und auch mir ist etwas aufgefallen. Und zwar wird unsynronisiert auf das Memo zugegriffen im oben gezeigten Beispiel. Wird OnConnect und OnDisconnect nicht vom Thread aus aufgerufen? Wenn doch sollte man zugriffe auf VCL-Komponenten tunlichst vermeiden.
Jens
  Mit Zitat antworten Zitat
Maddin1
 
#9
  Alt 30. Jun 2010, 18:00
Sobald ich eine Antwort vom Server zurückgeben lasse,
reagiert mein Client nicht mehr.

Ich habe den Client eine Nachricht senden lassen und
wollte daraufhin das gesamte Memo des Servers an das Memo
meines Clients senden lassen - aber keine Reaktion...
  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 21:09 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