![]() |
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 ![]() 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:
Wir belegen OnConnect mit folgendem Code:
Memo1.Lines.Add('Nachricht: ' + AContext.Connection.IOHandler.ReadLn);
Delphi-Quellcode:
Wir belegen OnDisconnect mit folgendem Code:
Memo1.Lines.Add('Verbindung: ' + AContext.Binding.PeerIP);
Delphi-Quellcode:
Somit wäre unser Server schon fertig.
Memo1.Lines.Add('Verbindungsabbruch: ' + AContext.Binding.PeerIP);
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:
Nun das Projekt compilieren und erstellen.
TCPClient.Connect;
if TCPClient.Connected then begin TCPClient.IOHandler.WriteLn('Dies ist eine Nachricht vom Clienten.'); TCPClient.Disconnect; end; 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. |
Re: Einsteigertutorial: Indy 10 nutzen
Hi,
kurze Frage. Wie kann ich den Server (!) dazu bewegen, dem Client Daten zurückzuschicken? Mfg und Danke Torsten |
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 |
Re: Einsteigertutorial: Indy 10 nutzen
Danke für die schnelle Antwort.
Ich bekomme da die Fehlermeldung undeklarierter Bezeichner 'Connections' Warum das denn? Mfg Torsten |
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 |
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 |
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 ;) |
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.
|
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 22:50 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