Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   Delphi Einsteigertutorial: Indy 10 nutzen (https://www.delphipraxis.net/105039-einsteigertutorial-indy-10-nutzen.html)

halinchen 14. Dez 2007 14:07


Einsteigertutorial: Indy 10 nutzen
 
Liste der Anhänge anzeigen (Anzahl: 1)
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:
Delphi-Quellcode:
Memo1.Lines.Add('Nachricht: ' + AContext.Connection.IOHandler.ReadLn);
Wir belegen OnConnect mit folgendem Code:
Delphi-Quellcode:
Memo1.Lines.Add('Verbindung: ' + AContext.Binding.PeerIP);
Wir belegen OnDisconnect mit folgendem Code:
Delphi-Quellcode:
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.

elcomportal 16. Okt 2009 17:24

Re: Einsteigertutorial: Indy 10 nutzen
 
Hi,
kurze Frage.
Wie kann ich den Server (!) dazu bewegen, dem Client Daten zurückzuschicken?
Mfg und Danke
Torsten

Klaus01 16. Okt 2009 17:34

Re: Einsteigertutorial: Indy 10 nutzen
 
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

elcomportal 16. Okt 2009 17:40

Re: Einsteigertutorial: Indy 10 nutzen
 
Danke für die schnelle Antwort.
Ich bekomme da die Fehlermeldung undeklarierter Bezeichner 'Connections'
Warum das denn?
Mfg
Torsten

Klaus01 16. Okt 2009 17:45

Re: Einsteigertutorial: Indy 10 nutzen
 
.. 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

elcomportal 16. Okt 2009 17:48

Re: Einsteigertutorial: Indy 10 nutzen
 
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

therowe 9. Jan 2010 21:00

Re: Einsteigertutorial: Indy 10 nutzen
 
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 ;)

SirThornberry 9. Jan 2010 21:08

Re: Einsteigertutorial: Indy 10 nutzen
 
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.

Maddin1 30. Jun 2010 18:00

AW: Einsteigertutorial: Indy 10 nutzen
 
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...


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:15 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