Εφαρμογή Delphi που στέλνει δεδομένα στον διακομιστή με τη μέθοδο POST (Indy). Συστατικά Indy που χρησιμοποιούνται στους Δελφούς

Το Indy είναι ένα αρκετά ισχυρό πακέτο στοιχείων που σας επιτρέπει να αναπτύξετε διάφορες εφαρμογές δικτύου. Σε αυτό το σεμινάριο θα σας πω πώς μπορείτε να δημιουργήσετε εφαρμογές πελάτη-διακομιστή χρησιμοποιώντας τα στοιχεία TIdTCPClient και TIdTCPServer.

Πρώτα απ 'όλα, θα ήθελα να σημειώσω δύο σημαντικά πλεονεκτήματα αυτών των στοιχείων. Το πιο σημαντικό από αυτά είναι το multithreading, που σημαίνει ότι ο διακομιστής δημιουργεί ένα ξεχωριστό νήμα για κάθε πελάτη και αυτό σίγουρα επηρεάζει την απόδοση του προγράμματος διακομιστή σε υπολογιστές με επεξεργαστή πολλαπλών πυρήνων. Το δεύτερο πλεονέκτημα είναι η ευκολία χρήσης. 10-20 γραμμές κώδικα είναι αρκετές για να γράψετε μια απλή εφαρμογή πελάτη-διακομιστή. Αυτό το πακέτο εξαρτημάτων υπάρχει σε τυπικά συγκροτήματα Delphi.

Ας γράψουμε ένα απλό πρόγραμμα, το οποίο σας επιτρέπει να μεταφέρετε ένα μήνυμα κειμένου από έναν πελάτη σε έναν διακομιστή. Ας ξεκινήσουμε τη δημιουργία του διακομιστή.
Ας τοποθετήσουμε το στοιχείο IdTCPServer από την καρτέλα "Indy Servers" στη φόρμα. Θα κάνουμε όλες τις ρυθμίσεις για αυτό το στοιχείο κατά το χρόνο εκτέλεσης στο συμβάν OnCreate της φόρμας:
IdTCPServer1.DefaultPort:= 12345;
IdTCPServer1.Active:= true;
Όλα είναι απλά εδώ - υποδεικνύουμε τη θύρα στην οποία θα λειτουργήσει ο διακομιστής και ενεργοποιούμε τον ίδιο τον διακομιστή.

Για τη λήψη δεδομένων στον διακομιστή από τον πελάτη, υπάρχει ένα ειδικό συμβάν "OnExecute". Αυτό το συμβάν μοιάζει με αυτό:

αρχίζουν
τέλος;

Ας επεξεργαστούμε το περιεχόμενο της εκδήλωσης ως εξής:
διαδικασία TForm3.IdTCPServer1Execute(AContext: TIdContext);
var
l:string; // μεταβλητή συμβολοσειράς στην οποία θα λάβουμε
αρχίζουν
l:= AContext.Connection.IOHandler.ReadLn();
Memo1.Lines.Add(l);
τέλος;

Τώρα, μόλις φτάσει ένα μήνυμα στον διακομιστή, θα το γράψουμε στη μεταβλητή συμβολοσειράς l και θα το εξάγουμε σε ένα πεδίο κειμένου πολλών γραμμών.

Αυτό, δεν αποτελεί έκπληξη, τερματίζει τη δημιουργία του διακομιστή. Ο Indy θα κάνει τα υπόλοιπα για εμάς. Ας ξεκινήσουμε με το πρόγραμμα πελάτη. Θα συνδεθεί στον διακομιστή, θα στείλει ένα μήνυμα σε αυτόν και θα αποσυνδεθεί από τον διακομιστή.

Ας δημιουργήσουμε νέο έργο, τοποθετήστε το στοιχείο IdTCPClient στη φόρμα, η οποία βρίσκεται στην καρτέλα "Πελάτες Indy". Θα τοποθετήσουμε επίσης μια απλή Επεξεργασία και ένα κουμπί. Ας δημιουργήσουμε ένα πρόγραμμα χειρισμού συμβάντων OnClick για το κουμπί, μέσα στο οποίο θα γράψουμε:
IdTCPClient1.Port:= 12345;
IdTCPClient1.Host:= '127.0.0.1';
IdTCPClient1.Connect;
IdTCPClient1.IOHandler.WriteLn(Edit1.Text);
IdTCPClient1.Disconnect;

Αυτός ο κωδικός δεν χρειάζεται να τοποθετηθεί στο συμβάν OnCreate. Μπορείτε να τοποθετήσετε αυτόν τον κωδικό όπου θέλετε, αν θέλετε.
Στην πρώτη γραμμή εκχωρούμε μια θύρα και είναι απαραίτητο να καθορίσουμε την ίδια θύρα που καθορίσαμε στο πρόγραμμα διακομιστή, διαφορετικά ο πελάτης απλά δεν θα βρει τον διακομιστή. Στη συνέχεια υποδεικνύουμε τη διεύθυνση IP του διακομιστή. Ο ίδιος ο διακομιστής μπορεί να βρίσκεται είτε σε τοπικό δίκτυο, και εξ αποστάσεως. Στην τελευταία περίπτωση, η σύνδεση θα γίνει μέσω Διαδικτύου και θα χρειαστεί να καθορίσετε μια διεύθυνση IP στο Διαδίκτυο.

Καθόρισα τη διεύθυνση "127.0.0.1", που σημαίνει ότι ο διακομιστής είναι ο υπολογιστής στον οποίο εκτελείται ο πελάτης. Αυτή η μέθοδος είναι πολύ βολική για τη δοκιμή εφαρμογών δικτύου.
Στη συνέχεια, κάνουμε μια σύνδεση, στέλνουμε ένα μήνυμα και αποσυνδέουμε. Όπως ακριβώς το ίδιο το μήνυμα, μπορείτε επίσης να πάρετε τη διεύθυνση IP από το Edit ή από οποιαδήποτε μεταβλητή συμβολοσειράς.

Οι εργασίες για το πρόγραμμα-πελάτη έχουν επίσης ολοκληρωθεί. Όπως μπορείτε να δείτε, το Indy κάνει τρομερή δουλειά για εμάς, γεγονός που δίνει τη δυνατότητα σε έναν άπειρο προγραμματιστή να δημιουργήσει τη δική του εφαρμογή δικτύου.

Το πρωτόκολλο UDP είναι αρκετά καλό για μετάδοση γραπτά μηνύματα, δηλαδή, μπορείτε να οργανώσετε τοπικές συνομιλίες και άλλα παρόμοια. Αποφάσισα να δώσω ένα παράδειγμα της πιο απλής εργασίας με το UDP στους Δελφούς.

Οδηγία βήμα προς βήμα:

Έδωσα ένα παράδειγμα, αλλά με συγχωρείτε, δεν έγραψα κάθε γραμμή, γιατί... Δεν βλέπω τίποτα περίπλοκο και ο καθένας μπορεί να το καταλάβει.

Στην πραγματικότητα, αν κάτι δεν είναι ξεκάθαρο, μπορείτε να μου κάνετε μια ερώτηση. Και εδώ είναι ο πραγματικός κωδικός:

χρήσεις
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Διάλογοι, StdCtrls, IdUDPServer, IdBaseComponent, IdComponent, IdUDPBase,
IdUDPClient, IdSocketHandle;

τύπος
TForm1 = κλάση (TForm)
IdUDPClient1: TIdUDPClient;
IdUDPServer1: TIdUDPServer;
Κουμπί 1: TButton;
Label1: TLabel;
διαδικασία FormCreate(Αποστολέας: TObject);
διαδικασία FormClose(Αποστολέας: TObject; var Ενέργεια: TCloseAction);
διαδικασία Button1Click(Αποστολέας: TObject);
διαδικασία IdUDPServer1UDRead(AThread: TIdUDPListenerThread; AData: TBytes;
ABBinding: TIdSocketHandle);
ιδιωτικός
(Ιδιωτικές δηλώσεις)
δημόσιο
(Δημόσιες δηλώσεις)
τέλος;

var
Form1: TForm1;

($R *.dfm)
[b]//Διαδικασία αποστολής μηνύματος
διαδικασία TForm1.Button1Click(Αποστολέας: TObject);
αρχίζουν
δοκιμάστε
IdUDPClient1.Active:= True;
IdUDPClient1.Host:= "localhost";
IdUDPClient1.Connect;
εάν IdUDPClient1.Συνδέθηκε τότε
αρχίζουν
IdUDPClient1.Send(TimeToStr(Time));
Label1.Caption:= "ok";
τέλος;
IdUDPClient1.Active:= False;
Beep;Beep;Beep;
εκτός
MessageDlg("Κάτι πήγε στραβά =(", mtError, , 0);
τέλος;
τέλος;
[σι]
//Ανενεργό. Διακομιστής UDP κατά την εκκίνηση και το κλείσιμο της φόρμας
διαδικασία TForm1.FormClose(Αποστολέας: TObject; var Ενέργεια: TCloseAction);
αρχίζουν
IdUDPServer1.Active:= False;
τέλος;

διαδικασία TForm1.FormCreate(Αποστολέας: TObject);
αρχίζουν
IdUDPServer1.Active:= True;
τέλος;

[b]//Διαδικασία αντίδρασης διακομιστή κατά τη λήψη δεδομένων
διαδικασία TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
AData: TBytes; ABBinding: TIdSocketHandle);
Var
i:Ακέραιος αριθμός;
s:String;
αρχίζουν
s:= "";
δοκιμάστε
i:= 0;
ενώ (AData[i] 0) κάνω
αρχίζουν
s:= s + chr(AData[i]);
i:= i + 1;
τέλος;
τελικά
Label1.Caption:= s;
τέλος;
τέλος;

Σερζ Ντοσιούκοφ Μάικ Φαμ

Αυτό το άρθρο σας δείχνει πώς να δημιουργήσετε μια αυτόνομη υπηρεσία Web χρησιμοποιώντας το κιτ Indy και το Delphi 7 και πώς να χρησιμοποιήσετε το κιτ Indy για την υποστήριξη υπηρεσιών Web που βασίζονται σε Delphi 7 SOAP. Πίσω Επιπλέον πληροφορίεςΓια πληροφορίες σχετικά με τη δημιουργία υπηρεσιών Ιστού, δείτε το εξαιρετικό άρθρο του Nick Hodges στον ιστότοπο της κοινότητας Borland: Shakespeare on the Web.

Αργά ή γρήγορα, μπορεί να χρειαστεί να δημιουργήσετε έναν διακομιστή που είναι αυτόνομος διακομιστής HTTP και υποστηρίζει υπηρεσίες Web. Για παράδειγμα, μπορεί να θέλετε να δημιουργήσετε έναν διακομιστή εφαρμογών που βασίζεται σε SOAP για μια εφαρμογή n-επιπέδων που έχει δημιουργηθεί με χρήση των Delphi.

Εισαγωγή

Η ηλεκτρονική βοήθεια των Delphi παρέχει εξαιρετική διαδοχική οδηγίασχετικά με τον τρόπο δημιουργίας μιας υπηρεσίας Web, διακομιστή MIDAS (μοντέλο COM, DCOM), αλλά πρακτικά δεν υπάρχουν πληροφορίες για τη δημιουργία μιας αυτόνομης εφαρμογής MIDAS n-tier που βασίζεται στο πρωτόκολλο SOAP.

Προηγουμένως δημοσιεύτηκε από τον Dave Nottage. Αυτό το άρθρο περιέγραψε την ιδέα του τρόπου δημιουργίας μιας υπηρεσίας Web στο Delphi 6 με υποστήριξη SOAP και τη δυνατότητα δημοσίευσης διεπαφών SOAP του Datamodule, δηλαδή, αυτό το άρθρο σάς επέτρεψε να μάθετε πώς να δημιουργείτε το δικό σας n-tier Συστήματα MIDAS.

Το Delphi 7 της Borland και το νέο κιτ Indy έχουν ενσωματωμένη υποστήριξη για αυτήν τη λειτουργία.

Ωστόσο, παρά την ενσωματωμένη υποστήριξη, αυτή η δυνατότητα δεν τεκμηριώνεται.

Οι πρόσφατες αναρτήσεις στο συνέδριο δικτύωσης Borland και η αναζήτηση στον Ιστό χρησιμοποιώντας έναν διακομιστή Google επέτρεψαν στους συγγραφείς να αναπτύξουν έναν τρόπο μετατροπής του υπάρχοντος κώδικα από το Delphi 6 σε Delphi 7. Αλλά όλα έχουν τον χρόνο τους.

κύρια ιδέα

Αυτό το άρθρο είναι το πρώτο μέρος μιας σειράς τριών μερών. Περιγράφει τις κύριες διατάξεις. Το δεύτερο και το τρίτο μέρος θα αφιερωθούν σε ορισμένα προβλήματα και τρόπους επίλυσής τους. Ας αρχίσουμε να περιγράφουμε την κύρια ιδέα.

  • να είναι ένας αυτόνομος διακομιστής HTTP.
  • χρησιμοποιήστε το Indy ως πλατφόρμα.
  • υποστήριξη δημοσίευσης μέσω πρωτοκόλλου SOAP.
  • να είναι σε θέση να δημοσιεύει SOAP DataModules, τα οποία θα σας επιτρέψουν να δημιουργήσετε τον δικό σας διακομιστή n-tier με βάση το SOAP/HTML.

Διακομιστής HTTP και SOAP

Πολλοί άνθρωποι γνωρίζουν το Indy και έχουν χρησιμοποιήσει στο παρελθόν στοιχεία διακομιστή THTTPS. Είναι εύκολο να τοποθετήσετε αυτό το στοιχείο σε μια φόρμα αίτησης, αλλά πώς μπορείτε να το κάνετε να υποστηρίζει το SOAP; Στον κατάλογο "C:Program FilesBorlandDelphi7SourceIndy" μπορείτε να βρείτε το αρχείο IdHTTPWebBrokerBridge.pas. Αυτό ακριβώς χρειάζεστε.

Αυτό το αρχείο δεν αποτελεί μέρος του εκτελέσιμου αρχείου Indy, επομένως πρέπει να το συμπεριλάβετε στο τρέχον έργο σας ως τυπικό αρχείο έργου. (Για τη μεταγλώττιση του έργου, θα χρειαστείτε επίσης το αρχείο IdCompilerDefines.inc.) Αυτά τα αρχεία πρέπει να αντιγραφούν στον τρέχοντα κατάλογο του έργου. Ενδέχεται να απαιτούνται αλλαγές κώδικα για να αυξηθεί η ταχύτητα, επομένως είναι καλύτερο να διατηρείτε αυτά τα αρχεία χωριστά από τη διανομή Indy.

Τα παρακάτω περιγράφουν την υλοποίηση ενός στοιχείου αντικατάστασης από τον THTTPServer, που επεκτείνεται για την υποστήριξη πακέτων SOAP, που ονομάζεται TIdHTTPWebBrokerBridge. Αυτή η κατασκευή είναι μια κλάση που κληρονομείται από τον TCustomHTTPServer και υποστηρίζει τη σύνδεση βασικών αιτημάτων.

Επειδή αυτή η κλάση δεν είναι προσβάσιμη από την παλέτα, θα χρειαστεί να την ορίσετε ως κανονικό αντικείμενο κατά την εκτέλεση του κώδικά σας.

Αυτό το αντικείμενο μπορεί να χρησιμοποιηθεί ακριβώς με τον ίδιο τρόπο όπως ένας κανονικός διακομιστής THTTPS, με εξαίρεση εκείνες τις πρόσθετες ιδιότητες που επιτρέπουν τη λειτουργία με SOAP.
Ωστόσο, ας δούμε πρώτα την προετοιμασία του απαραίτητου κώδικα.

WebBroker και Indy

Για όσους έχουν δημιουργήσει υπηρεσίες Web στο παρελθόν, γνωρίζετε ότι χρησιμοποιείτε WebBroker. Το Delphi 7, όπως και το Delphi 6, χρησιμοποιεί την αρχιτεκτονική WebBroker για την υποστήριξη του SOAP.

Επομένως, πρέπει να δημιουργήσετε μια ενότητα TWebModuleκαι τοποθετήστε τα ακόλουθα τρία στοιχεία σε αυτό: THTTPSoapDispatcher, THTTPSoapPascalInvoker και TWSDLHTMLPublish. Όλα είναι διαθέσιμα από την καρτέλα WebServices της παλέτας στοιχείων. Αφού συνδέσετε το SOAPDispatcher με το SOAPPascalInvoker, η φόρμα αίτησης είναι έτοιμη. Το τελικό αποτέλεσμα θα πρέπει να είναι κάτι σαν αυτό που φαίνεται στο παρακάτω σχήμα:

(ενότητα uWebModule.pas)

Είναι καλύτερο να αφήσετε τα πάντα ως έχουν, καθώς δεν χρειάζεται να αλλάξετε ή να εκτελέσετε οποιονδήποτε προσαρμοσμένο κώδικα για αυτήν τη φόρμα.

WebModule και Indy

Ας προχωρήσουμε στο άλλο μέρος του κώδικα που απαιτείται για την υλοποίηση του διακομιστή HTTP.

Όπως μπορείτε να δείτε, το TIdHTTPWebBrokerBridge διαθέτει μια μέθοδο RegisterWebModuleClass, η οποία σας επιτρέπει να καταχωρήσετε το δικό σας WebModule και να το κάνετε διαθέσιμο στο διακομιστή.

Έτσι, μετά τη δημιουργία του αντικειμένου διακομιστή fServer, πρέπει απλώς να καλέσετε την κλάση fServer.RegisterWebModuleClass (TwmSOAPIndy).

Σημείωση.Σε μια κανονική υλοποίηση του TIdHTTPWebBrokerBridge, ένα αντικείμενο TwmSOAPIndy θα δημιουργείται κάθε φορά που λαμβάνεται ένα αίτημα. Προφανώς αυτό δεν είναι απαραίτητο. Επομένως, η κλάση μπορεί να τροποποιηθεί για να παρέχει μόνιμη δημιουργία αυτού του αντικειμένουγια όσο διάστημα υπάρχει το αντικείμενο Server. Συνιστάται να ανατρέξετε στην τεκμηρίωση υλοποίησης της τάξης για περισσότερες πληροφορίες.

Είναι έτοιμος ο διακομιστής;

Συστατικά Indy που χρησιμοποιούνται στο Delphi 6.

Εκτός από τις βασικές υπηρεσίες και πρωτόκολλα Διαδικτύου, υπάρχει ένα ευρύ φάσμα πρόσθετων υπηρεσιών, οι δυνατότητες των οποίων χρησιμοποιούνται συχνά από προγραμματιστές Διαδικτύου. Επιπλέον, η δυνατότητα εμφάνισης πληροφοριών χρησιμοποιώντας ένα πρόγραμμα περιήγησης δεν είναι πάντα αποδεκτή λύση για εφαρμογές Διαδικτύου. Σε αυτήν την περίπτωση, είναι λογικό να χρησιμοποιείται η υποδομή του Διαδικτύου για ανταλλαγή δεδομένων και να παρέχεται προβολή πληροφοριών μέσω πιο σύνθετων εφαρμογών πελατών που έχουν αναπτυχθεί, για παράδειγμα, στους Δελφούς.

Ας υποθέσουμε ότι πρέπει να εφαρμόσετε εξειδικευμένη λογική διακομιστή που δεν περιλαμβάνεται στους τυπικούς διακομιστές Ιστού. Για την επίλυση αυτής της κατηγορίας προβλημάτων, οι Delphi περιλαμβάνουν τη βιβλιοθήκη Internet Direct (Indy) από τη Nevrona Designs (http://www.nevrona.com/Indy/). Αυτή η βιβλιοθήκη, που αναπτύχθηκε ειδικά για το Borland Delphi, έχει ήδη οκτώ εκδόσεις, η τελευταία από τις οποίες περιλαμβάνεται στο νέα έκδοσηΔελφοί. Το σύνολο των στοιχείων χωρίζεται σε τρεις ομάδες: πελάτη (Indy Client), διακομιστή (Indy Servers) και βοηθητικό (Indy Misc).

Πελάτες Indy και Διακομιστές Indy

Η πλειοψηφία Συστατικά IndyΟι Διακομιστές Client και Indy είναι ζεύγη που αντιστοιχούν στα μέρη του πελάτη και του διακομιστή των πρωτοκόλλων και των υπηρεσιών (με εξαίρεση τα μεμονωμένα στοιχεία που βασίζονται κυρίως σε διακομιστή όπως TunnelMaster και TunnelSlave) και επιτρέπουν τη χρήση πρωτοκόλλων όπως TCP/IP, UDP, NNTP, SMTP, FTP , HTTP, καθώς και υπηρεσίες ECHO, FINGER, WHOIS κ.λπ.

Τα στοιχεία πελάτη Indy γράφονται με χρήση υποδοχών. Η υποδοχή στην πλευρά του πελάτη απαιτεί σύνδεση με τον διακομιστή. Εάν δημιουργηθεί η σύνδεση, ο πελάτης και ο διακομιστής μπορούν να αρχίσουν να ανταλλάσσουν μηνύματα. Αυτά τα μηνύματα είναι διαφορετικής φύσης, αλλά συνήθως η ανταλλαγή πραγματοποιείται χρησιμοποιώντας ένα συγκεκριμένο πρωτόκολλο (για παράδειγμα, HTTP)

TIdTCPClient και TIdTCPSserver

Αυτά τα στοιχεία χρησιμοποιούνται για την υποστήριξη ενός από τα κύρια πρωτόκολλα δικτύου - TCP (Transmission Control Protocol), και είναι επίσης οι βασικές κλάσεις για τα στοιχεία TIdSMTP και TIdFTP. Η κλάση TIdTCPServer έχει μια ιδιότητα ThreadMgr που ορίζεται από προεπιλογή σε μηδέν. Εάν το ThreadMgr είναι μηδενικό όταν είναι ενεργοποιημένος ο TIdTCPServer, η κλάση TIdThreadMgrDeafault θα δημιουργηθεί σιωπηρά. Διαφορετικά, χρησιμοποιείται ο εγκατεστημένος διαχειριστής διεργασιών.

TIdUDPClient και TIdUDPServer

Αυτά τα εξαρτήματα χρησιμοποιούνται για υποστήριξη πρωτόκολλο δικτύου UDP (User Datagram Protocol) και είναι επίσης οι βασικές κλάσεις για μια σειρά από άλλα στοιχεία Indy.

TIdChargenServer

Το στοιχείο χρησιμοποιείται για τη δημιουργία τυχαίων συμβόλων, συνήθως για δοκιμαστικούς σκοπούς.

TIdDayTime και TIdDayTimeServer

Τα εξαρτήματα χρησιμοποιούνται για την παροχή χρόνου υπηρεσίας. Ο πελάτης ζητά και ο διακομιστής αναφέρει την τρέχουσα ημερομηνία και ώρα.

TIdDNSResolver

Αυτό είναι ένα στοιχείο πελάτη που εξυπηρετεί αιτήματα από έναν διακομιστή DNS (Υπηρεσία ονόματος τομέα). Τα ερωτήματα διακομιστή DNS έχουν σχεδιαστεί για να αντικαταστήσουν το όνομα ενός υπολογιστή με τη διεύθυνση IP του. Το TIdDNSResolver είναι απόγονος της κλάσης TIdUDPClient.

TIdDICTServer

Ένα στοιχείο διακομιστή που υποστηρίζει το Dictionary Server Protocol (DICT), ένα λεξικό από την πλευρά του διακομιστή που βασίζεται στο πρωτόκολλο TCP που επιτρέπει σε έναν πελάτη να έχει πρόσβαση σε ένα λεξικό φυσικής γλώσσας.

TIdDISCARDServer

Το στοιχείο διακομιστή που υποστηρίζει τον διακομιστή εγγραφών. Οι εγγραφές μπορούν να χρησιμοποιηθούν ως εργαλείο εντοπισμού σφαλμάτων και μέτρησης. Η υπηρεσία αρχείων απλώς παραδίδει οποιαδήποτε δεδομένα σε όποιον θέλει να τα λάβει.

TI dEcho και TI dECHOServer

Τα στοιχεία έχουν σχεδιαστεί για να παρέχουν μια υπηρεσία απόκρισης, η οποία χρησιμοποιείται συνήθως για τον έλεγχο της υγείας του δικτύου. Ο πελάτης στέλνει ένα μήνυμα κειμένου στον διακομιστή, ο διακομιστής επιστρέφει το μήνυμα στον πελάτη. Εάν το μήνυμα είναι αλλοιωμένο, το δίκτυο παρουσιάζει δυσλειτουργία.

TIdFinger και TIdFingerServer

Τα στοιχεία έχουν σχεδιαστεί για να παρέχουν ένα πρωτόκολλο που επιτρέπει στον χρήστη να ρωτήσει δεδομένα σχετικά με την παρουσία άλλων χρηστών στο σύστημα. Ορισμένοι διακομιστές χειρίζονται τέτοια αιτήματα πελατών. Η χρήση αυτού του ζεύγους στοιχείων θα σας επιτρέψει να εξυπηρετήσετε αιτήματα πελατών που καθορίζουν την παρουσία άλλων χρηστών στο σύστημα.

Το στοιχείο περιλαμβάνει πλήρη υποστήριξη για το πρωτόκολλο μεταφοράς αρχείων - FTP (File Transfer Protocol). Υποστηρίζεται η παθητική και ενεργή μεταφορά δεδομένων, καθώς και λειτουργίες όπως GET και PUT, διαγραφή καταλόγων, λήψη ορίων, μεγέθη αρχείων και καταλόγων. Το TI dFTP χρησιμοποιεί την κλάση TIdSimpleServer για να λειτουργήσει. Όταν μια μεταφορά αρχείου FTP είναι σε εξέλιξη, μια δευτερεύουσα σύνδεση TCP ανοίγει για μεταφορά δεδομένων και κλείνει όταν τα δεδομένα έχουν μεταφερθεί. Αυτή η σύνδεση ονομάζεται "σύνδεσμος δεδομένων", μοναδική για κάθε αρχείο που μεταφέρεται.

TIdGopher και TIdGopherServer

Αυτά τα στοιχεία έχουν σχεδιαστεί για να παρέχουν ένα πρωτόκολλο δικτύου που έχει αντικατασταθεί Πρόσφατααπό το WWW ( Παγκόσμιος Web) Πρωτόκολλο HTTP. Ο διακομιστής που υλοποιεί αυτό το πρωτόκολλο παρέχει ένα ιεραρχικά κατανεμημένο σύστημα υποστήριξης ροής εγγράφων. Ένα παράδειγμα χρήσης αυτού του ζεύγους στοιχείων, που βρίσκεται στον κατάλογο demosindyGopherClient και demosindy GopherServer, δείχνει πώς χρησιμοποιώντας αυτό το πρωτόκολλο μπορείτε να παρέχετε πληροφορίες στο τοπικό δίκτυο σχετικά με αρχεία που βρίσκονται στον υπολογιστή σας, συμπεριλαμβανομένων των κλειστών.

TIdHostNameServer

Ένα στοιχείο διακομιστή σχεδιασμένο να μεταβιβάζει το όνομα του τοπικού διακομιστή στους πελάτες.

TIdHTTP και TIdHTTPSserver

Τα στοιχεία χρησιμοποιούνται για την παροχή του πρωτοκόλλου δικτύου HTTP (υποστηρίζονται οι εκδόσεις 1.0 και 1.1, συμπεριλαμβανομένων των λειτουργιών GET, POST και HEAD). Επιπλέον, παρέχεται υποστήριξη για έλεγχο ταυτότητας και χρήση διακομιστών μεσολάβησης. Το στοιχείο διακομιστή χρησιμοποιείται για την παροχή υπηρεσιών σε άλλο διακομιστή Web που υποστηρίζει ένα δεδομένο πρωτόκολλο. Ο TIdHTTPServer διευκολύνει την υλοποίηση λειτουργιών όπως cookies, διαχείριση κατάστασης κ.λπ.

TIdIcmpClient

Ένα στοιχείο πελάτη που έχει σχεδιαστεί για να παρέχει το Πρωτόκολλο Μηνυμάτων Ελέγχου Διαδικτύου (ICMP), το οποίο χρησιμοποιείται για την εκτέλεση λειτουργιών ping και ανίχνευσης δικτύου.

Ένα στοιχείο πελάτη που έχει σχεδιαστεί για να παρέχει το Πρωτόκολλο Ταχυδρομείου (POP), συμπεριλαμβανομένης της υποστήριξης για κωδικοποίηση και αποκωδικοποίηση MIME και μετάδοση χαρακτήρων πολλών byte.

TIdIMAP4Server

Ένα στοιχείο διακομιστή που έχει σχεδιαστεί για να υποστηρίζει λειτουργίες IMAP (Internet Message Access Protocol) στον διακομιστή. Το πρωτόκολλο σάς επιτρέπει να αναζητάτε μηνύματα ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗστον διακομιστή. Η διαφορά μεταξύ των πρωτοκόλλων IMAP και POP είναι ότι το πρωτόκολλο POP απαιτεί πρόσθετη μνήμηγια αποθήκευση δεδομένων και το πρωτόκολλο IMAP αποκτά πρόσβαση στον διακομιστή αντί του υπολογιστή-πελάτη. Το IMAP4 δημιουργήθηκε για να αντικαταστήσει το POP3, αλλά το POP3 παραμένει ένα ευρέως χρησιμοποιούμενο πρότυπο μέχρι σήμερα.

TIdIRCSserver

Ένα στοιχείο διακομιστή που έχει σχεδιαστεί για να υποστηρίζει τις πιο συχνά χρησιμοποιούμενες λειτουργίες υπηρεσιών στο Διαδίκτυο, που συνήθως ονομάζεται συνομιλία. Το στοιχείο παρέχει βασικά δομικά στοιχείαγια διακομιστή IRC (Internet Relay Chat).

TIdMappedPortTCP

Ένα στοιχείο διακομιστή που έχει σχεδιαστεί για τη δημιουργία αντιστοιχισμένων θυρών, οι οποίες χρησιμοποιούνται συχνά σε διακομιστές μεσολάβησης. Οι μέθοδοι αυτού του στοιχείου σάς επιτρέπουν να αντιστοιχίσετε τη μια θύρα στην άλλη. Για παράδειγμα, η θύρα 80 θα μπορούσε να αντιστοιχιστεί στη θύρα 3000 και όλα τα αιτήματα στην πρώτη θύρα (θύρα 80) θα προωθηθούν στη δεύτερη θύρα (θύρα 3000).

TIdNNTP και διακομιστής TIdNNTPS

Αυτά τα στοιχεία απαιτούνται για την υποστήριξη του Πρωτοκόλλου Μεταφοράς Ειδήσεων Δικτύου (NNTP) που χρησιμοποιείται στις υπηρεσίες ειδήσεων. Το στοιχείο πελάτη περιλαμβάνει υποστήριξη για κωδικοποίηση και αποκωδικοποίηση MIME, καθώς και υποστήριξη για χαρακτήρες πολλαπλών byte και εναλλακτικές κωδικοποιήσεις. Το στοιχείο διακομιστή σάς επιτρέπει να δημιουργείτε διακομιστές ειδήσεων. Είναι σημαντικό να σημειωθεί ότι ο TIdNNTPServer δεν είναι ένας διακομιστής ειδήσεων με πλήρεις δυνατότητες, αλλά ένα στοιχείο που παρέχει τη βασική λειτουργικότητα για έναν τέτοιο διακομιστή.

TIdQOTD και TIdQOTDSserver

Τα στοιχεία χρησιμοποιούνται για την παροχή της υπηρεσίας Προσφοράς της Ημέρας. Το στοιχείο πελάτη συνδέεται με το στιγμιότυπο του στοιχείου διακομιστή για να λάβει την ημερήσια προσφορά. Κάθε παράδειγμα διακομιστή περιέχει μια μοναδική βάση δεδομένων παραπομπών.

Ένα στοιχείο πελάτη σχεδιασμένο για χρήση σε εφαρμογές Simple Mail Transfer Protocol (SMTP), που παρέχει υποστήριξη για έλεγχο ταυτότητας, κωδικοποίηση και αποκωδικοποίηση MIME και υποστήριξη χαρακτήρων πολλών byte.

Ένα στοιχείο πελάτη σχεδιασμένο να παρέχει SNTP (Simple Network Time Protocol) - μια υπηρεσία χρόνου. Μπορεί να χρησιμοποιηθεί για σύνδεση σε οποιαδήποτε υπηρεσία ώρας για προσδιορισμό τρέχουσες ημερομηνίεςκαι του χρόνου.

TIdSimpleServer

Στοιχείο διακομιστή που παρέχει έναν ελαφρύ διακομιστή TCP. Σας επιτρέπει να οργανώσετε μια σύνδεση από σημείο σε σημείο. Χρησιμοποιείται για τη δημιουργία διακομιστών με έναν μόνο χρήστη, δηλαδή μπορεί να εξυπηρετήσει μόνο μία σύνδεση κάθε φορά. Σε αντίθεση με το στοιχείο TIdTCPServer, δεν δημιουργεί δευτερεύουσες διεργασίες κατά την αναμονή αιτημάτων από πελάτες και κατά την επεξεργασία αυτών των αιτημάτων. Με άλλα λόγια, εάν ο διακομιστής εξυπηρετεί ένα αίτημα από έναν πελάτη και εκείνη τη στιγμή ένας άλλος πελάτης επικοινωνεί μαζί του για να συνδεθεί, τότε θα αποκλειστεί μέχρι το τέλος της επεξεργασίας του πρώτου αιτήματος.

TIdTelnet και TIdTelnetServer

Το στοιχείο πελάτη χρησιμοποιείται για την οργάνωση απομακρυσμένων περιόδων σύνδεσης σε άλλον υπολογιστή, συμπεριλαμβανομένων των διαπραγματεύσεων στην κονσόλα και του ελέγχου ταυτότητας. Το πρωτόκολλο επικοινωνίας προϋποθέτει την παρουσία ενός ατόμου που αλληλεπιδρά διαδραστικά με τον διακομιστή. Το στοιχείο πελάτη δεν διαθέτει υποστήριξη οθόνης ή εξομοίωση τερματικού, αλλά απλώς παρέχει σύνδεση με το τμήμα διακομιστή. Συνήθως, το πρωτόκολλο διακομιστή TIdTelnetServer χρησιμοποιείται για την οργάνωση απομακρυσμένων βάσεων δεδομένων με διεπαφή κειμένου για διαδραστική αλληλεπίδραση με πελάτες.

TIdTime και TIdTimeServer

Το στοιχείο πελάτη είναι μια εναλλακτική του στοιχείου TIdSNTP για τον προσδιορισμό του χρόνου. Είναι σημαντικό να σημειωθεί ότι οι μορφές των δύο πρωτοκόλλων είναι διαφορετικές. Το TIdTime βασίζεται στη μορφή RFC 868 (επιστρέφει την ώρα στο εσωτερικό πρότυπο UNIX OS, εκτελώντας όλες τις απαραίτητες μετατροπές). Το στοιχείο διακομιστή είναι παρόμοιο στη λειτουργία του με το διακομιστή DayTime. Μπορεί να χρησιμοποιηθεί για την υλοποίηση μιας υπηρεσίας χρόνου τοπικός υπολογιστής. Δεν απαιτείται πρόσθετος κωδικός, απλώς δημιουργήστε μια παρουσία του TIdTimeServer που θα επιστρέψει την ώρα του εσωτερικού ρολογιού του υπολογιστή διακομιστή.

TIdTrivialFTP και TIdTrivialFTPServer

Αυτά τα στοιχεία είναι απαραίτητα για την οργάνωση ενός απλού πρωτοκόλλου μεταφοράς αρχείων. Το στοιχείο πελάτη αυτού του πρωτοκόλλου χρησιμοποιείται για σύνδεση σε μια παρουσία του αντίστοιχου στοιχείου διακομιστή. Το πρωτόκολλο προορίζεται για ιδιωτικές, ελαφριές, τοπικές περιπτώσεις μεταφοράς αρχείων, για παράδειγμα σε τοπικά δίκτυα ή για φόρτωση (φόρτωση) πινάκων δρομολόγησης σε δρομολογητές. Λόγω των εξασθενημένων χαρακτηριστικών αυτού του πρωτοκόλλου, η χρήση του δεν συνιστάται όταν χρησιμοποιείτε αλγόριθμους ελέγχου ταυτότητας ή άλλους μηχανισμούς ασφαλείας. Ο κύριος σκοπός αυτού του πρωτοκόλλου είναι η μεταφορά αρχείων σε μια συσκευή υλικού με σκοπό την τροποποίησή της.

TIdTunnelMaster και TIdTunnelSlave

Τα στοιχεία της σήραγγας διακομιστή χρησιμοποιούνται σε διακομιστές μεσολάβησης για την οργάνωση πολλαπλών λογικών συνδέσεων σε μία φυσική (σήραγγα). Αυτές οι κλάσεις μπορούν να χρησιμοποιηθούν για διάφορους σκοπούς, για παράδειγμα, για την οργάνωση μιας μυστικής σύνδεσης μέσω μη απόρρητων καναλιών.

TIdWhois και TIdWhoIsServer

Αυτό το στοιχείο πελάτη συνδέεται με οποιονδήποτε τυπικό διακομιστή Whois, επιτρέποντάς σας να λαμβάνετε πληροφορίες σχετικά με τομείς. Το στοιχείο διακομιστή παρέχει τη βασική λειτουργικότητα ενός διακομιστή NIC.

Indy Misc

Η σελίδα παλέτας Indy Miscellaneous Components περιλαμβάνει BASE64, UUE, Quoted Printable και άλλες κοινές μορφές επικοινωνίας email, κωδικοποιητές (MD2, MD4 και MD5) για πρότυπα κρυπτογραφίας που χρησιμοποιούνται για την αποθήκευση κωδικών πρόσβασης και ηλεκτρονικές υπογραφέςσε μη αναστρέψιμη (δύσκολα αποκρυπτογραφημένη) μορφή, καθώς και πολλά άλλα χρήσιμα στοιχεία και βοηθητικά προγράμματα που χρησιμοποιούνται συχνά στην ανάπτυξη εφαρμογών Διαδικτύου.

TIdAntiFreeze

Λόγω των αλγορίθμων που βασίζονται σε μπλοκ των στοιχείων Indy, συχνά φαίνεται ότι η εφαρμογή έχει κολλήσει ενώ λειτουργεί η σύνδεση. Για να εξαλειφθεί η χρήση δευτερευουσών διεργασιών (νημάτων) κατά την οργάνωση των επικοινωνιών για την αποφυγή παγώματος της εφαρμογής, αρκεί να τοποθετήσετε το καθορισμένο στοιχείο στη φόρμα.

Το στοιχείο λειτουργεί αναλύοντας αιτήματα από τη στοίβα πρωτοκόλλου TCP/IP και στέλνοντας μηνύματα στην εφαρμογή κατά τη διάρκεια της καθυστέρησης όταν μπλοκάρονται οι εξωτερικές συνδέσεις, γεγονός που δημιουργεί την ψευδαίσθηση ότι εκτελείται κώδικας. Δεδομένου ότι το στοιχείο επηρεάζει αποκλεισμένες συνδέσεις μόνο για την κύρια διαδικασία, δεν απαιτείται η χρήση του TIdAntiFreeze σε δευτερεύουσες διεργασίες της εφαρμογής. Λάβετε υπόψη ότι το στοιχείο TIdAntiFreeze επιβραδύνει τις συνδέσεις επειδή η κύρια διαδικασία διακόπτεται περιοδικά για την επεξεργασία μηνυμάτων. Ως εκ τούτου, πρέπει να ληφθεί μέριμνα ώστε να διασφαλιστεί ότι η εφαρμογή που αναπτύσσεται δεν δαπανά πολύ χρόνο στην επεξεργασία μηνυμάτων, συμπεριλαμβανομένων των OnClick, OnPaint, OnResize, κ.λπ. Σε κάποιο βαθμό, αυτό μπορεί να ελεγχθεί μέσω των ιδιοτήτων της κλάσης TIdAntiFreeze. Η χρήση αυτού του στοιχείου δεν είναι υποχρεωτική, αλλά σας επιτρέπει να λύσετε το πρόβλημα του συγχρονισμού των συνδέσεων με την οπτική διεπαφή της εφαρμογής.

TIdDateTimeStamp

Μια κλάση για την εκτέλεση μαθηματικών ημερομηνίας και ώρας που σχετίζεται με το γεγονός ότι τα πρωτόκολλα Διαδικτύου χρησιμοποιούν διαφορετικές μορφές ημερομηνίας και ώρας. Επιπλέον, οι πελάτες και οι διακομιστές ενδέχεται να βρίσκονται σε διαφορετικές ζώνες ώρας.

TIdIPWatch

Είναι ένα στοιχείο που βασίζεται σε χρονοδιακόπτη που παρακολουθεί συνεχώς τις αλλαγές στη διεύθυνση IP του υπολογιστή. Συμβάντα στοιχείων συμβαίνουν όταν εντοπίζεται μια αλλαγή. Αυτό το στοιχείο χρησιμοποιείται συνήθως για να ανιχνεύσει εάν ένας υπολογιστής είναι συνδεδεμένος στο Διαδίκτυο ή σε οποιοδήποτε άλλο δίκτυο. Η αλλαγή στη διεύθυνση IP σε αυτήν την κατάσταση μπορεί να συμβεί λόγω της εκχώρησης της διεύθυνσης IP από τον διακομιστή DHCP (Dynamic Host Configuration Protocol) κατά τη σύνδεση στο νέο δίκτυο.

TIdLogDebug

Ο σκοπός αυτού του στοιχείου είναι να υποκλέψει συμβάντα οποιουδήποτε στοιχείου πελάτη ή διακομιστή και να τοποθετήσει μια εγγραφή του συμβάντος καθορισμένο αρχείο. Αυτό το στοιχείο είναι πολύ χρήσιμο για τον εντοπισμό σφαλμάτων στοιχείων Indy.

TIdMessage

Το στοιχείο χρησιμοποιείται σε συνδυασμό με άλλα στοιχεία για τη σωστή αποκρυπτογράφηση ή κωδικοποίηση μηνυμάτων. Αυτά μπορεί να είναι στοιχεία POP, SMTP και NNTP. Η κλάση υποστηρίζει κρυπτογράφηση και αποκρυπτογράφηση MIME, χαρακτήρες πολλαπλών byte και κωδικοποίηση ISO.

Υπολογιστής TIdNetwork

Ένα από τα λίγα στοιχεία Indy που μπορούν να χρησιμοποιηθούν κατά την κατασκευή εφαρμογών. Η αριθμομηχανή δικτύου μπορεί να χρησιμοποιηθεί για την εκτέλεση υπολογισμών σε διευθύνσεις IP, συμπεριλαμβανομένων μάσκας δικτύου, υποδικτύου, κλάσεων δικτύου κ.λπ.

TIdThreadMgrΠροεπιλογή

Το στοιχείο παρέχει έλεγχο δευτερευουσών διεργασιών από προεπιλογή. Δημιουργείται όταν οποιοδήποτε στοιχείο Indy που υποστηρίζει τη διαχείριση διεργασιών δεν έχει οριστεί μια παρουσία της κλάσης TIdThreadManager. Το στοιχείο παρέχει μόνο βασικές δυνατότητες για τη διαχείριση δευτερευουσών διεργασιών: δημιουργία και καταστροφή τους κατά παραγγελία.

TIdThreadMgrPool

Ένα πιο προηγμένο στοιχείο διαχείρισης διεργασιών από το TIdThreadMgrDefault επειδή συγχωνεύει διαδικασίες αντί να τις δημιουργεί ή τις καταστρέφει κατά παραγγελία.

TIdVCard

Το VCard είναι το ηλεκτρονικό ισοδύναμο μιας επαγγελματικής κάρτας και μπορεί να περιέχει προσωπικά στοιχεία και γραφικά δεδομένα του ιδιοκτήτη.

TIdIMFDecoder

Σχεδιασμένο για αποκωδικοποίηση μηνυμάτων Διαδικτύου. Είναι απόγονος της κλάσης TIdCoder, όπως όλα τα άλλα στοιχεία κωδικοποιητή. Η κλάση TIdCoder αποκωδικοποιείται σύμφωνα με το πρότυπο μορφής μηνυμάτων κειμένου ARPA Internet RFS-822, που προτάθηκε τον Αύγουστο του 1982, και το πρότυπο ανταλλαγής μηνυμάτων USENET RFC 1036, που προτάθηκε τον Δεκέμβριο του 1987.

Το στοιχείο επεκτείνει την κλάση TIdCoder για να επιτρέπει την ανίχνευση της μορφής RFS-822 από το περιβάλλον της κεφαλίδας, παρέχοντας λειτουργία αποκρυπτογράφησης στη λήψη και κρυπτογράφηση και αποκρυπτογράφηση MIME. Το στοιχείο TIdIMFDecoder χρησιμοποιείται στην κλάση TIdMessageClient για την αποκωδικοποίηση των ληφθέντων και μεταδιδόμενων μηνυμάτων.

TIdQuotedPrintableEncoder

Το QuotedPrintableEncoder σάς επιτρέπει να αποκρυπτογραφείτε κείμενο στην καθορισμένη μορφή. Μπορεί να χρησιμεύσει ως αυτόνομο στοιχείο με έναν καθορισμένο τύπο κωδικοποίησης, επιτρέποντας τη μετάδοση μηνυμάτων που περιέχουν έναν νέο τύπο κωδικοποίησης.

TIdBase64Encoder

Υλοποιεί έναν άλλο αλγόριθμο κρυπτογράφησης που καθιστά δυνατή τη μετάδοση μη εκτυπώσιμων χαρακτήρων.

Κωδικοποιητής TIdUUE

Υλοποιεί έναν από τους πρώτους αλγόριθμους κρυπτογράφησης, την κωδικοποίηση UU. Μερικές φορές χρησιμοποιείται κατά την αποστολή άρθρων σε μια υπηρεσία ειδήσεων.

TIdXXEncoder

Αυτή η μέθοδος κρυπτογράφησης είναι απίθανο να χρησιμοποιηθεί ποτέ. Ουσιαστικά, πρόκειται για την ίδια κωδικοποίηση UU, αλλά με διαφορετικό πίνακα κρυπτογράφησης.

TIdCoderMD2

Στοιχεία με διαφορετικούς τύπους αλγόριθμου κρυπτογράφησης MD (Message Digest). Όλα βασίζονται σε τυχαία σειρά, μονόδρομα και δεν έχουν αλγόριθμους αποκρυπτογράφησης.

Στοιχεία πελατών και διακομιστών πρωτοκόλλου μπορούν να χρησιμοποιηθούν για την ανάπτυξη εφαρμογών Διαδικτύου διακομιστή και πελάτη, μαζί ή αντί για βασικές (ClientSocket, ServerSocket) και άλλα στοιχεία από το Internet και την παλέτα Fastnet. Τα στοιχεία Indy δεν χρησιμοποιούν την αρχιτεκτονική WebBroker, υλοποιώντας υποστήριξη χαμηλού επιπέδου για πρωτόκολλα και υπηρεσίες Διαδικτύου απευθείας στον πηγαίο κώδικα τους ( πηγαίους κώδικεςείναι συνημμένα).

TIdConnectionInterceptOpenSSL και TIdServerInterceptOpenSSL

Το πρωτόκολλο SSL - Secure Sockets Layer, που διασφαλίζει τη μυστικότητα και την αξιοπιστία της επικοινωνίας μεταξύ δύο εφαρμογών, έχει δύο επίπεδα. Στο χαμηλό επίπεδο ενός πρωτοκόλλου μεταφοράς πολλαπλών επιπέδων (όπως το TCP), το SSL είναι ένα πρωτόκολλο εγγραφής και χρησιμοποιείται για την ενθυλάκωση διαφόρων πρωτοκόλλων υψηλότερου επιπέδου. Το πλεονέκτημα του SSL είναι ότι είναι ένα ανεξάρτητο πρωτόκολλο εφαρμογής, αλλά ένα πρωτόκολλο υψηλότερου επιπέδου μπορεί να χρησιμοποιηθεί πάνω από το SSL.

Το SSL παρέχει ασφάλεια επικοινωνίας, η οποία έχει τρεις κύριες λειτουργίες: παροχή εμπιστευτικής σύνδεσης. κρυπτογράφηση με δημόσιο κλειδί(χρησιμοποιείται για την επιβεβαίωση της γνησιότητας του παραλήπτη)· υποστήριξη για αξιοπιστία μετάδοσης δεδομένων.

  • Η συμμετρική κρυπτογραφία χρησιμοποιείται για την κρυπτογράφηση δεδομένων (π.χ. DES, RC4 κ.λπ.).
  • Ψηφιακή υπογραφήπαρέχεται χρησιμοποιώντας ασύμμετρη κρυπτογράφηση δημόσιου κλειδιού (για παράδειγμα, RSA, DSS, κ.λπ.).
  • Η αξιοπιστία της επικοινωνίας, η μεταφορά μηνυμάτων περιλαμβάνει τον έλεγχο της ακεραιότητας του μηνύματος μέσω κωδικών διόρθωσης MAC, ασφαλών συναρτήσεων κατακερματισμού (π.χ. SHA, MD5, κ.λπ.) χρησιμοποιώντας υπολογισμούς MAC.

Σε συνδυασμό με HTTP και έλεγχο ταυτότητας διακομιστή, το SSL παρέχει απαραίτητες λειτουργίεςκρυπτογράφηση και περαιτέρω διατηρεί την εγκατεστημένη σύνδεση, διπλό έλεγχο της αυθεντικότητας του διακομιστή Web κ.λπ. Είναι σημαντικό να κατανοήσουμε ότι το SSL προστατεύει μόνο τις επικοινωνίες κατά τη μεταφορά δεδομένων και δεν αντικαθιστά άλλους μηχανισμούς ασφαλείας.

Τα στοιχεία TIdConnectionInterceptOpenSSL και TIdServerInterceptOpenSSL παρέχουν συνδέσεις τόσο από την πλευρά του πελάτη όσο και από την πλευρά του διακομιστή χρησιμοποιώντας το πρωτόκολλο SSL. Θα πρέπει να σημειωθεί ότι τα στοιχεία TIdConnectionInterceptOpenSSL και TIdServerInterceptOpenSSL είναι διαθέσιμα μόνο στο Delphi 6 και όχι στο Kylix. Αυτό οφείλεται στην πολυπλοκότητα του πρωτοκόλλου, το οποίο στην περίπτωση υλοποίησης των Windows βασίζεται σε λειτουργίες του λειτουργικού συστήματος.

Παραδείγματα χρήσης στοιχείων Indy μπορούν να βρεθούν στους καταλόγους /Delphi6/Demos/Indy. Συνολικά, η βιβλιοθήκη Indy στην έκδοση 8.0 περιέχει 69 στοιχεία. Αναφέρεται ότι στην έκδοση 9.0 η καθορισμένη βιβλιοθήκη θα περιέχει 86 στοιχεία. Όλα τα στοιχεία είναι ενοποιημένα και περιλαμβάνονται τόσο στο Delphi 6 όσο και στο Kylix, γεγονός που τους επιτρέπει να χρησιμοποιούνται για την ανάπτυξη εφαρμογών πολλαπλών πλατφορμών. Όλα τα στοιχεία Indy υποστηρίζουν πολλαπλές νήματα.

Τα στοιχεία Indy υλοποιούν σχεδόν όλες τις λειτουργίες που βρίσκονται στα στοιχεία Internet και Fastnet, όπως φαίνεται καθαρά στον πίνακα.

Συστατικά Fastn et Συστατικά Indy Σκοπός των εξαρτημάτων
1 TserverSocket, TClientSocket TIdTCPserverSocket, TIdTCPClientSocket Αλληλεπίδραση μεταξύ δύο υπολογιστών (πελάτη και διακομιστή) χρησιμοποιώντας το πρωτόκολλο TCP/IP
2 TNMDayTime TIdDayTime, TIdDayTimeServer Ερώτηση στον διακομιστή για την τρέχουσα ώρα
3 TNMEcho TIdEcho, TIdEchoServer Χρησιμοποιείται για την επικοινωνία με τον διακομιστή απόκρισης
4 TNMFinger TIdFinger, TIdFingerServer Χρησιμοποιείται για τη λήψη πληροφοριών σχετικά με τον χρήστη από έναν διακομιστή αναζήτησης στο Διαδίκτυο
5 TNMFTP TIdFTP, TIdTrivialFTP, TIdTrivialFTPSserver Παρέχετε μεταφορά αρχείων χρησιμοποιώντας πρωτόκολλο FTP
6 TNMHTTP TIdHTTP, διακομιστής TIdHTTPS Χρησιμοποιήστε το πρωτόκολλο HTTP για την ανταλλαγή δεδομένων
7 TNMMsgServ, TNMMsg Χρησιμοποιείται για τη μετάδοση απλών μηνυμάτων κειμένου από πελάτη σε διακομιστή
8 TNMNNTP TIdNNTP, TIdNNTPSδιακομιστής Υποστηρίζει την ανταλλαγή δεδομένων με διακομιστή ειδήσεων
9 TNMPOP3 TIdPOP3 Χρησιμοποιείται για τη λήψη email από διακομιστή αλληλογραφίας χρησιμοποιώντας το πρωτόκολλο POP3
10 TNMSMTP TIdSMTP Χρησιμοποιείται για την αποστολή email μέσω διακομιστή αλληλογραφίας Διαδικτύου
11 TNMStrm, TNMStrmServ Μεταδίδει δυαδικά δεδομένα γραμμένα σε μια ροή χρησιμοποιώντας το πρωτόκολλο TCP/IP
12 TNMUDP TIdUDP, TIdUDPServer Μεταφέρετε δεδομένα χρησιμοποιώντας το πρωτόκολλο UDP
13 TpowerSock, TNMGeneralServer Κλάσεις ενθυλακωμένες σε στοιχεία που αποτελούν τη βάση για τη σύνταξη των δικών σας πελατών (Powersock) και διακομιστών (NMGeneralServer)
14 Επεξεργαστής TNMUUP TIdUUEncoder, TIdUUDecoder Πραγματοποιήστε επανακωδικοποίηση δυαδικά αρχείασε μορφή MIME ή UUENCODE
15 TNMURL Μετατρέπει τις συμβολοσειρές σε Μορφή HTMLκαι εκτελεί αντίστροφη επανακωδικοποίηση

Οι εξαιρέσεις είναι κλάσεις όπως TNMMsgServ, TNMMsg, TNMStrm, TNMStrmServ, TpowerSock, TNMGeneralServer, TNMURL, οι οποίες είτε εφαρμόζουν παρωχημένα πρωτόκολλα είτε έχουν λειτουργικότητα που υλοποιείται σε μια μεγάλη ομάδα εναλλακτικών κλάσεων.

Ωστόσο, σε αντίθεση με τους προκατόχους του - τα στοιχεία Internet και Fastnet, το Indy περιέχει πλουσιότερα στοιχεία διακομιστή και στοιχεία για διακωδικοποίηση και κρυπτογράφηση δεδομένων, καθώς και υποστήριξη ελέγχου ταυτότητας (Παλέτα Indy Misc). Όπως φαίνεται από τον παραπάνω πίνακα, τα κύρια πρωτόκολλα και οι υπηρεσίες παρέχονται όχι μόνο από τον πελάτη, αλλά και από τα στοιχεία του διακομιστή. Πρόκειται για υπηρεσίες χρόνου, υπηρεσίες απόκρισης, λήψη πληροφοριών χρήστη, καθώς και πρωτόκολλα HTTP, NNTP, UDP και ακόμη και την απλούστερη έκδοση του FTP.

Μερικά παραδείγματα χρήσης στοιχείων Indy

Στα στοιχεία Indy που περιέχονται στους Delphi, η διεύθυνση IP ορίζεται στην ιδιότητα Host, συνήθως μόνο σε εφαρμογές-πελάτες. Τα στοιχεία που φιλοξενούνται από τον διακομιστή έχουν μεθόδους που σας επιτρέπουν να ξεκινήσετε ή να σταματήσετε τη λήψη της αντίστοιχης θύρας - για παράδειγμα, η αλλαγή της ιδιότητας Active του στοιχείου IdTCPServer ξεκινά ή διακόπτει τη λήψη της αντίστοιχης θύρας. Μόλις δημιουργηθεί η σύνδεση μεταξύ του πελάτη και του διακομιστή, μπορεί να ξεκινήσει η μεταφορά δεδομένων.

Τα στοιχεία Indy δίνουν μεγάλη έμφαση στην ασφάλεια και την αξιοπιστία κατά την εργασία με δεδομένα. Για παράδειγμα, το στοιχείο IdTCPClient έχει μεθόδους σύνδεσης και αποσύνδεσης. Χρησιμοποιώντας μια τεχνική προγραμματισμού όπως ο παρακάτω κώδικας από την πλευρά του πελάτη:

Με το TCPClient ξεκινήστε τη Σύνδεση. δοκιμάστε το lstMain.Items.Add(ReadLn); τελικά Αποσύνδεση? τέλος; τέλος;

και χρησιμοποιώντας την ιδιότητα Connection που μεταβιβάστηκε ως παράμετρος στην παρουσία AThread της κλάσης TIdPeerThread από την πλευρά του διακομιστή:

Με το AThread.Connection ξεκινά το WriteLn("Hello from Basic Indy Server server."); Αποσυνδέω; τέλος;

μπορείτε να βασιστείτε είτε στην κανονική εκτέλεση της σύνδεσης είτε στον σωστό χειρισμό σφαλμάτων.

Σημειώστε τις μεθόδους ReadLn και WriteLn των αντίστοιχων κλάσεων - μοιάζουν με τυπικές δηλώσεις Pascal I/O. Αυτό είναι ένα αφιέρωμα στην τεχνική προγραμματισμού UNIX, όπου οι περισσότερες λειτουργίες του συστήματος εκτελούνται με ανάγνωση και εγγραφή στα αντίστοιχα αρχεία.

Ακριβώς όπως τα στοιχεία Fastnet, οι κλάσεις στοιχείων Indy έχουν συμβάντα που μπορούν να χρησιμοποιηθούν για την παροχή διαχείρισης συμβάντων. Για παράδειγμα, μπορείτε να κανονίσετε την εμφάνιση ενός μηνύματος σε μια φόρμα κατά τη σύνδεση με έναν πελάτη:

Διαδικασία TForm1.IdECHOServer1Connect(AThread: TIdPeerThread); start lblStatus.caption:= "[ Πελάτης εξυπηρέτησης ]"; τέλος;

Το Indy παρέχει στοιχεία που υλοποιούν πρωτόκολλα με τμήματα πελάτη και διακομιστή που είναι μοναδικά σε αυτήν τη βιβλιοθήκη. Τα στοιχεία TIdGopherServer και TIdGopher, χάρη στις μεθόδους GetExtendedMenu, GetFile, GetMenu, GetTextFile στην πλευρά του πελάτη και ReturnGopherItem, SendDirectoryEntry στην πλευρά του διακομιστή, βοηθούν στην προβολή αρχείων διάφοροι τύποι, συμπεριλαμβανομένων εκείνων που έχουν επισημανθεί ως κρυφά, καθώς και καταλόγων σε απομακρυσμένος υπολογιστής(παρόμοιο με αυτό που κάνει η εντολή dir *.* λειτουργικό σύστημα MS-DOS).

Χρησιμοποιώντας τα στοιχεία IdSMTP και IdMessage, μπορείτε εύκολα να δημιουργήσετε τη δική σας εφαρμογή Web που μπορεί να στείλει αλληλογραφία χρησιμοποιώντας το πρωτόκολλο SMTP.

Σε αυτήν την περίπτωση, η κλάση IdMessage (ένα από τα 23 στοιχεία από τη σελίδα Indy Misc) είναι υπεύθυνη για τη δημιουργία του μηνύματος, που ακολουθεί το όνομά του, και το IdSMTP είναι για την οργάνωση της σύνδεσης με τον διακομιστή αλληλογραφίας.

Η τεχνολογία που χρησιμοποιείται στο Indy χρησιμοποιεί λειτουργίες κλειδώματος ανάγνωσης και εγγραφής. Οποιαδήποτε λειτουργία Connect που χρησιμοποιείται στο Indy περιμένει να ολοκληρωθεί η σύνδεση. Όταν εργάζεστε με στοιχεία πελάτη Indy, συνήθως πρέπει να κάνετε τα εξής:

  • ζητήστε σύνδεση με τον διακομιστή.
  • να κάνετε αιτήματα ανάγνωσης και εγγραφής στον διακομιστή (ανάλογα με τον τύπο του διακομιστή, το βήμα εκτελείται μία φορά ή επαναλαμβάνεται πολλές φορές).
  • τερματίστε τη σύνδεση με τον διακομιστή και αποσυνδεθείτε.

Τα στοιχεία Indy έχουν σχεδιαστεί για να παρέχουν ένα εξαιρετικά υψηλό επίπεδο αφαίρεσης. Οι περιπλοκές και οι λεπτομέρειες της στοίβας TCP/IP είναι κρυμμένες από τον προγραμματιστή, έτσι ώστε να μπορεί να επικεντρωθεί στην εργασία που εκτελεί.

Το παρακάτω μικρό παράδειγμα δείχνει μια τυπική συνεδρία φασολιών πελάτη:

Με το IndyClient ξεκινήστε το Host:= "zip.pbe.com"; // Κεντρικός υπολογιστής για κλήση Θύρα:= 6000; // Θύρα για κλήση του διακομιστή στο Connect. δοκιμάστε // Ο κωδικός σας πηγαίνει εδώ τελικά Αποσύνδεση. τέλος; τέλος;

Στο παράδειγμα, ακόμα κι αν η σύνδεση με τον διακομιστή δεν έχει δημιουργηθεί, η σύνδεση θα τερματιστεί χαριτωμένα λόγω της χρήσης της δήλωσης try-finally.

Τα στοιχεία διακομιστή του Indy περιγράφουν μια ποικιλία μοντέλων διακομιστών που μπορούν να χρησιμοποιηθούν ανάλογα με τις ανάγκες σας και το πρωτόκολλο που χρησιμοποιείτε.

Ο TIdTCPServer είναι το πιο συχνά χρησιμοποιούμενο στοιχείο διακομιστή, το οποίο δημιουργεί μια δευτερεύουσα διαδικασία ανεξάρτητη από την κύρια διαδικασία εφαρμογής. Η διαδικασία που δημιουργήθηκε αναμένει για εισερχόμενα αιτήματα από πιθανούς πελάτες. Δημιουργείται μια μεμονωμένη δευτερεύουσα διαδικασία για κάθε πελάτη στο αίτημα του οποίου ανταποκρίνεται. Τα συμβάντα που συμβαίνουν κατά τη διάρκεια της διαδικασίας συντήρησης σχετίζονται με το πλαίσιο των αντίστοιχων διαδικασιών.

Με άλλα λόγια, για κάθε σύνδεση πελάτη, η κλάση TIdTCPServer χρησιμοποιεί ένα μοναδικό δευτερεύον νήμα καλώντας το πρόγραμμα χειρισμού συμβάντων OnExecute αυτού του νήματος. Η επίσημη παράμετρος της μεθόδου OnExecute είναι μια αναφορά σε μια παρουσία της κλάσης Athread που αντιστοιχεί στο νήμα που δημιουργήθηκε. Η ιδιότητα Connection αυτής της κλάσης είναι μια αναφορά στην κλάση TIdTCPConnection, μια παρουσία της οποίας δημιουργείται για την επεξεργασία του αιτήματος πελάτη. Το TIdTCPConnection υποστηρίζει την ανάγνωση και την εγγραφή μέσω της σύνδεσης, καθώς και τη δημιουργία και τον τερματισμό μιας συνεδρίας επικοινωνίας.

Το πρωτόκολλο UDP λειτουργεί χωρίς να έχει προηγουμένως καθιερωθεί σύνδεση με τον διακομιστή (κάθε απεσταλμένο πακέτο είναι ένα ανεξάρτητο σύνολο δεδομένων και όχι μέρος μιας μεγαλύτερης περιόδου λειτουργίας ή σύνδεσης). Ενώ ο TIdTCPServer δημιουργεί ξεχωριστά νήματα για κάθε σύνδεση, ο TIdUDPServer χρησιμοποιεί είτε ένα κύριο νήμα είτε ένα μεμονωμένο δευτερεύον νήμα που χειρίζεται όλα τα αιτήματα πρωτοκόλλου UDP. Όταν ο TIdUDPServer είναι ενεργός, δημιουργείται ένα νήμα για να ακούει τα εισερχόμενα πακέτα UDP. Για κάθε πακέτο που λαμβάνεται, ένα συμβάν OnUDPRead τίθεται είτε στο κύριο νήμα είτε στο πλαίσιο του νήματος ακρόασης, ανάλογα με την τιμή της ιδιότητας ThreadedEvent. Όταν το ThreadedEvent αξιολογείται σε False, το συμβάν εμφανίζεται στο κύριο νήμα, διαφορετικά εμφανίζεται στο νήμα ακρόασης. Κατά την επεξεργασία του συμβάντος, άλλες λειτουργίες διακομιστή αποκλείονται. Επομένως, είναι σημαντικό να διασφαλίσετε ότι οι διαδικασίες OnUDRead εκτελούνται όσο το δυνατόν γρηγορότερα.

Εάν χρειάζεται να δημιουργήσετε μια νέα εφαρμογή πελάτη για έναν υπάρχοντα διακομιστή χρησιμοποιώντας ένα υπάρχον πρωτόκολλο, η δουλειά σας είναι μόνο να αναπτύξετε και να διορθώσετε σφάλματα στην εφαρμογή πελάτη. Ωστόσο, όταν πρέπει να αναπτύξετε τόσο τον πελάτη όσο και εφαρμογή διακομιστήΕίτε χρησιμοποιούμε ένα υπάρχον είτε ένα νέο πρωτόκολλο, βρισκόμαστε αντιμέτωποι με το κλασικό πρόβλημα «κοτόπουλο και αυγό». Από πού να ξεκινήσετε τον προγραμματισμό - από τον πελάτη ή από τον διακομιστή;

Προφανώς, τόσο ο πελάτης όσο και ο διακομιστής πρέπει να δημιουργηθούν τελικά. Για πολλές εφαρμογές, ειδικά εκείνες που χρησιμοποιούν πρωτόκολλο που βασίζεται σε κείμενο (όπως το HTTP), είναι ευκολότερο να ξεκινήσετε τη δημιουργία της εφαρμογής σχεδιάζοντας τον διακομιστή. Και για τον εντοπισμό σφαλμάτων υπάρχει ήδη ένας βολικός πελάτης. Αυτή είναι μια εφαρμογή κονσόλας Telnet που είναι διαθέσιμη τόσο σε Windows όσο και σε UNIX.

Εάν πληκτρολογήσετε την κονσόλα εντολή telnet 127.0.0.1 80 με τη διεύθυνση IP του τοπικού υπολογιστή και τον αριθμό θύρας 80, που χρησιμοποιείται από προεπιλογή από τους διακομιστές Ιστού, τότε η εφαρμογή θα απαντήσει με το κείμενο που φαίνεται στην Εικ. 6, στην περίπτωση των Windows 2000 OS και IIS 5.0.

Για να δημιουργήσετε τον απλούστερο διακομιστή χρησιμοποιώντας στοιχεία Indy που χρειάζεστε:

Εάν χρειάζεται να σχεδιάσετε έναν διακομιστή που όχι μόνο θα ενημερώνει σωστά τους πελάτες του όταν η σύνδεση χαθεί, αλλά και θα τους παρέχει πληροφορίες σχετικά με καταστάσεις σφαλμάτων που έχουν προκύψει, χρησιμοποιήστε τη δήλωση try-except αντί για try-finally - για παράδειγμα, ως φαίνεται στο ακόλουθο παράδειγμα:

Διαδικασία TDataModule1.IdTCPServer1Execute(AThread: IdPeerThread); var s: String; ξεκινήστε με το AThread.Connection δοκιμάστε δοκιμάστε το s:= ReadLn; // Εκτελέστε την εργασία του διακομιστή εδώ // εάν δεν υπάρχει εξαίρεση, // γράψτε την απάντηση του διακομιστή WriteLn(ες), εκτός από το e: Εξαίρεση θα αρχίσει WriteLn(e.Message); end; //on end; //δοκιμάστε εκτός από το τέλος Αποσύνδεση· τέλος· τέλος·

Αυτό το μικρό παράδειγμα δείχνει τα βήματα για τη δημιουργία ενός απλού διακομιστή κειμένου, καθώς και τον τρόπο εντοπισμού σφαλμάτων.

Ο διακομιστής που περιγράφεται παραπάνω είναι ένα τυπικό παράδειγμα οργάνωσης των σύγχρονων κατανεμημένων υπολογιστών.

Δυνατότητες δημιουργίας εφαρμογών πολλαπλών επιπέδων

Πρόσφατα, πολλοί διακομιστές χρησιμοποιούνται όλο και περισσότερο για την ικανοποίηση αιτημάτων πελατών. Ένας διακομιστής αυτού του τύπου, έχοντας λάβει ένα αίτημα πελάτη και το έχει προετοιμάσει εν μέρει για περαιτέρω επεξεργασία, επικοινωνεί με έναν άλλο διακομιστή και του στέλνει το μετασχηματισμένο αίτημα ή αιτήματα. Ο διακομιστής δεύτερου επιπέδου μπορεί, με τη σειρά του, να επικοινωνεί με άλλους διακομιστές. Έτσι, μπορούμε να μιλήσουμε για μια αρχιτεκτονική διακομιστή πολλαπλών επιπέδων.

Στη συνέχεια θα δημιουργήσουμε έναν διακομιστή πρόσβασης δεδομένων, σκοπός του οποίου είναι η επιστροφή δεδομένων από τη βάση δεδομένων. Αυτός ο διακομιστής, ωστόσο, δεν διαβάζει ή γράφει απευθείας στα αρχεία της βάσης δεδομένων. Αντίθετα, επικοινωνεί με τον διακομιστή της βάσης δεδομένων αναζητώντας τα δεδομένα που απαιτούνται από τον πελάτη.

Έτσι, ξεκινάμε την ανάπτυξη μιας εφαρμογής με αρχιτεκτονική τριών επιπέδων. Για να δημιουργήσετε έναν διακομιστή βάσης δεδομένων χρησιμοποιώντας στοιχεία Indy, χρειάζεστε:

  1. Δημιουργήστε ένα νέο έργο.
  2. Τοποθέτησε κύρια μορφήπαρουσία έργου του στοιχείου TIdTCPServer από την παλέτα Indy Servers.
  3. Ορίστε την ιδιότητα DefaultPort της παρουσίας κλάσης TIdTCPServer1 σε 6001 (συνιστάται να εκχωρήσετε μεγάλες τιμές για να αποφύγετε την αντιγραφή αριθμών θυρών σε διαφορετικές εφαρμογές) και ορίστε την ιδιότητα Active σε true.
  4. Προσθέστε μια νέα ενότητα στο έργο επιλέγοντας το Αρχείο | Νέο | Μονάδα δεδομένων και τοποθετήστε στιγμιότυπα των στοιχείων SQLConnection και SQLDataSet σε αυτό από την καρτέλα dbExpress στην παλέτα στοιχείων.
  5. Ορίστε την ιδιότητα ConnectionName της κλάσης SQLConnection σε IBLocal και το LoginPrompt σε False. Εάν δεν έχετε διαμορφώσει το IBLocal στη βάση δεδομένων staff.gdb, ολοκληρώστε πρώτα αυτήν τη διαδικασία.

Γεια σε όλους!

Κατά την ανάπτυξη του επόμενου έργου Ιστού, προέκυψε η εργασία - να εφαρμοστεί λογισμικό πελάτη στους Δελφούς, το οποίο θα μετέφερε δεδομένα στον διακομιστή χρησιμοποιώντας τη μέθοδο POST. Η εφαρμογή πρέπει να μεταδίδει κείμενο και να ανεβάζει αρχεία στον διακομιστή Web.

Υλοποίηση τέτοιας αποστολής δεδομένων με χρήση γλωσσών από την πλευρά του διακομιστή Ανάπτυξη διαδικτύου(για παράδειγμα, PHP) είναι αρκετά απλό, αλλά αν χρειάζεται να γράψετε λογισμικό πολλών χρηστών βασισμένο σε εφαρμογές που αλληλεπιδρά με τον διακομιστή, τότε είναι λίγο πιο περίπλοκο. Η μέθοδος απευθείας σύνδεσης στη βάση δεδομένων και μέσω FTP στον διακομιστή από τους Δελφούς δεν είναι πλέον απαραίτητη γιατί δεν είναι ασφαλές, δεν είναι αξιόπιστο (αλλαγή κωδικών πρόσβασης, δεδομένα σύνδεσης κ.λπ.) και δημιουργεί πρόσθετα. προβλήματα συμβατότητας λογισμικού από την πλευρά του πελάτη. Για να λύσω το πρόβλημα, αποφάσισα να γράψω σενάρια (τμήμα διακομιστή) σε PHP που θα επεξεργάζονται τα εισερχόμενα αιτήματα POSTκαι επιστρέψτε το αποτέλεσμα στον πελάτη (εφαρμογή Delphi). Τα πλεονεκτήματα αυτής της προσέγγισης είναι ότι όλες οι συνδέσεις και η επεξεργασία δεδομένων πραγματοποιούνται στον διακομιστή, κάτι που είναι πολύ πιο ασφαλές από μια άμεση "σύνδεση".

Όταν άρχισα να γκουγκλάρω, πολλές διάσπαρτες πληροφορίες παραιτήθηκαν, κυρίως σε φόρουμ, αλλά ήταν όλα κομμάτια. Ένα πράγμα ήταν βέβαιο ότι θα χρησιμοποιηθεί το Indy, δηλαδή το στοιχείο IdHTTP με την εφαρμογή της μεθόδου POST. Στην πραγματικότητα, όλα είναι απλά, αυτή τη μέθοδοπαίρνει δύο παραμέτρους Url ενός πόρου και DataStream (ροή δεδομένων) και επιστρέφει το αποτέλεσμα σε μορφή κειμένου (μπορεί επίσης να είναι ο κώδικας HTML της σελίδας). Το κύριο πράγμα ήταν ο σωστός σχηματισμός του DataStream (ροή μεταδιδόμενων δεδομένων), αλλά στην πορεία προέκυψαν πρόσθετες παγίδες, δηλαδή η ρωσική κωδικοποίηση (αν δεν ήταν καλή). Εδώ ξεκίνησε η διασκέδαση για αρκετές ώρες περιπλάνησης στο Διαδίκτυο. Γενικά, αρκετή φλυαρία, ας περάσουμε στην εξάσκηση και την υλοποίηση του λογισμικού.

Το πρόγραμμα λοιπόν είναι απλό. Πρέπει να στείλει δεδομένα στον διακομιστή χρησιμοποιώντας τη μέθοδο POST, τα δεδομένα περιέχουν " Επικεφαλίδα " (γραμμή), " Περιγραφή » ( κείμενο πολλών γραμμών) Και αρχείο γραφικών(jpg, png, gif-δυαδικά δεδομένα). Ο διακομιστής πρέπει να αποδεχτεί αυτά τα δεδομένα, να τα επεξεργαστεί, να αποθηκεύσει το αρχείο γραφικών στον διακομιστή και να επιστρέψει μια απάντηση. Ως απάντηση, θα επιστρέψουμε τους Δελφούς στην εφαρμογή, το ίδιο κείμενο μόνο με πρόσθετες ετικέτες και έναν σύνδεσμο προς το αρχείο που κατεβάσατε. Τίποτα άλλο.

Ας ξεκινήσουμε με την υλοποίηση του τμήματος διακομιστή (παρόμοιο με το API του ιστότοπου). Ανοίξτε οποιοδήποτε επεξεργαστής κειμένου(σημειωματάριο) και γράψτε τον ακόλουθο κώδικα σε αυτό:

"; ) else ( echo "Τίτλος: Λείπει"."
"; ) //Ελέγξτε τα εισερχόμενα δεδομένα για την παρουσία των δεδομένων πεδίου "περιεχόμενο" εάν (!empty($_POST["content"]))(echo "Content: ".$_POST["content"]."
"; ) else ( echo "Περιεχόμενο: Λείπει"."
"; ) //Ελέγξτε τα εισερχόμενα δεδομένα για την παρουσία ενός συνημμένου αρχείου "αρχείου" εάν (!empty($_FILES["file"])) ($finfo = pathinfo($_FILES["file"]["name" ]). )==0)( echo ">>>>>>>Μη έγκυρος τύπος αρχείου<<<<<<<<"; exit; //Если не допустим тип, полностью останавливаем скрипт } $fname = "files/" . "testimgfile." . $finfo["extension"]; //формируем путь и новое имя файла move_uploaded_file($_FILES["file"]["tmp_name"],$fname);//сохраняем временный файл "tmp_name" в файл $fname echo "http://".$_SERVER["HTTP_HOST"]."/".$fname; //возвращаем полный путь к файлу } ?>

Σημείωση! Κατά την αποθήκευση (μέσω σημειωματάριου), πρέπει να καθορίσετε την κωδικοποίηση "UTF-8", διαφορετικά θα υπάρξουν προβλήματα με την εμφάνιση του κυριλλικού αλφαβήτου!

Το σενάριο προσπάθησε να δώσει λεπτομερή σχόλια. Αντιγράψτε αυτό το σενάριο στον διακομιστή Ιστού σας, εάν δεν έχετε, μπορείτε να χρησιμοποιήσετε το σενάριό μου για τη δοκιμή, βρίσκεται στη διεύθυνση: http://api..php

Η διάταξη χρησιμοποιεί τα ακόλουθα στοιχεία: Ετικέτα, Κουμπί (2 τεμ.), Επεξεργασία (2 τεμ.), Σημείωση (2 τεμ.), Πλαίσιο ελέγχου, OpenDialog, IdHTTP. Δώστε τα ακόλουθα ονόματα στοιχείων (ιδιότητα " Ονομα”):

  1. Επεξεργασία (τίτλος) – Όνομα=τίτλος;
  2. Επεξεργασία (διαδρομή προς το αρχείο) Όνομα = imgfile;
  3. Σημείωση (Περιεχόμενα)Όνομα = περιεχόμενο;
  4. Σημείωση (Αποτέλεσμα) – Όνομα = απάντηση;
  5. Κουμπί (…) – Όνομα = chkfile;
  6. Κουμπί (POST) - Όνομα = PostΑλλά;
  7. OpenDialog (Διάλογος επιλογής αρχείου) – Όνομα = PictDialog;

Ας αφήσουμε τα IdHTTP1 και CheckBox1 αμετάβλητα (κουρασμένοι! :)))).

Για να μην γίνει τυχαία" επεξεργασία» διαδρομή προς Επεξεργασία( imgfile), ορίστε την ιδιότητα ReadOnly σε True. Ομοίως, στο imgfileΚαι chkfileΟρίστε την ιδιότητα Enabled σε false. Θα τα ενεργοποιήσουμε χρησιμοποιώντας το CheckBox, δηλ. Θα παρέχουμε την ευκαιρία να επιλέξετε αν θα ανεβάσετε μια εικόνα ή όχι.

Για OpenDialog( PictDialog) πρέπει να ορίσετε το φίλτρο (ιδιότητα φίλτρου) ως εξής:

Η πραγματική οπτική προετοιμασία τελείωσε! Ας ξεκινήσουμε την κωδικοποίηση!

Στο έργο θα δημιουργήσουμε μια ροή δεδομένων χρησιμοποιώντας τον τύπο που περιλαμβάνεται στο Indy - TidMultiPartFormDataStream.Αν και συναντήσαμε επιλογές υλοποίησης χρησιμοποιώντας το TStream, δουλεύοντας με TidMultiPartFormDataStream –ευκολότερη!

Για να κάνουμε αυτόν τον τύπο διαθέσιμο στο έργο μας, πρέπει να προσθέσουμε την ακόλουθη βιβλιοθήκη στο Uses: IdMultipartFormData.

Για το CheckBox1, δημιουργήστε ένα συμβάν OnClick (κάνοντας διπλό κλικ με το ποντίκι στο αντικείμενο) και προσθέστε τον ακόλουθο κώδικα σε αυτό το συμβάν:

Διαδικασία TForm1.CheckBox1Click(Sender: TObject); έναρξη //κάνει ενεργά ή ανενεργά τα στοιχεία διαδρομής του αρχείου και τα κουμπιά διαλόγου imgfile.Enabled:=CheckBox1.Checked; chkfile.Enabled:=CheckBox1.Checked; τέλος;

Εδώ ενεργοποιούμε τα αντικείμενα imgfile Καιchkfileανάλογα με την παρουσία ενός σημάδι επιλογής (αν είναι επιλεγμένο το πλαίσιο ελέγχου, τότε τα αντικείμενα γίνονται ενεργά).

Τώρα ας οργανώσουμε την επιλογή της εικόνας. Για να το κάνετε αυτό, δημιουργήστε ένα συμβάν OnClick στο κουμπί chkfile(επίσης κάνοντας διπλό κλικ στο αντικείμενο) και γράψτε τα εξής:

Διαδικασία TForm1.chkfileClick(Sender: TObject); ξεκινήστε //άνοιξε το παράθυρο διαλόγου και εισαγάγετε την πλήρη διαδρομή προς το αρχείο στο imgfile(TEdit) εάν PictDialog.Execute τότε imgfile.Text:= PictDialog.FileName; τέλος;

Αυτό το συμβάν θα ενεργοποιήσει ένα παράθυρο διαλόγου επιλογής εικόνας και εάν ο χρήστης κάνει κλικ στο " Ανοιξε", τότε θα προστεθεί η διαδρομή προς αυτό το αρχείο imgfile.

Και τώρα ερχόμαστε στο τελικό κουμπί «ΑΝΑΡΤΗΣΗ». Δημιουργήστε ένα συμβάν OnClick για αυτό το κουμπί και προσθέστε τον ακόλουθο κώδικα:

Διαδικασία TForm1.PostButClick(Sender: TObject); var dataPost:TIdMultiPartFormDataStream; start dataPost:=TIdMultiPartFormDataStream.Create; dataPost.AddFormField("title",title.Text,"utf-8").ContentTransfer:= "8bit"; dataPost.AddFormField("content",content.Text,"utf-8").ContentTransfer:= "8bit"; if CheckBox1.Checked και (trim(imgfile.Text)="") τότε //ελέγξετε εάν το αρχείο είναι επιλεγμένο ή όχι ξεκινά το ShowMessage("Πρέπει να επιλέξετε ένα αρχείο γραφικών!"); έξοδος; τέλος; αν CheckBox1.Checked τότε dataPost.AddFile("file",imgfile.Text,""); //προσθέστε ένα πεδίο με την απάντηση αρχείου.Text:= StringReplace(idHTTP1.Post("http://api..php",dataPost)"
",#13#10,); datapost.Free; end;

Λοιπόν, με τη σειρά (αν και υπάρχουν σχόλια):

Datapost – αντικείμενο τύπου TIdMultiPartFormDataStream. Σας επιτρέπει να δημιουργήσετε μια δομή αιτήματος POST που αποτελείται από πεδία διαφορετικών τύπων.

dataPost . AddFormField (" τίτλος ", τίτλος . Κείμενο ," utf -8 "). Μεταφορά περιεχομένου := " 8 κομμάτι "; – προσθέτει ένα πεδίο με το όνομα "title" στο DataPost, μια τιμή από το "title.Text", ορίζει την κωδικοποίηση των μεταδιδόμενων δεδομένων σε "utf-8" (η παράμετρος είναι προαιρετική, αλλά χωρίς ρητή ένδειξη, το κυριλλικό γράμμα μεταδίδεται με ερωτηματικά «;») και μια πολύ σημαντική μέθοδος «Μεταφορά περιεχομένου». Χωρίς αυτήν τη μέθοδο, τα δεδομένα αποστέλλονται στον διακομιστή " μυστηριώδης ή μαγική λέξη" Λάβετε υπόψη ότι το όνομα του πεδίου ("τίτλος") στην πλευρά αποστολής πρέπει να ταιριάζει με το όνομα που καθορίζεται στο σενάριο: $_POST["title"].

Τα δεδομένα μεταφέρονται παρόμοια με το πεδίο «περιεχόμενο».

dataPost . Προσθήκη αρχείου (" αρχείο ", imgfile . Κείμενο ,"") – με αυτή τη γραμμή δημιουργούμε μια ροή με δεδομένα από το αρχείο.

Αυτό είναι όλο, τα δεδομένα δημιουργούνται, το μόνο που μένει είναι να τα μεταφέρετε στο σενάριο του διακομιστή και να λάβετε μια απάντηση:

answer.Text:= StringReplace(idHTTP1.Post("http://api..php",dataPost)"
",#13#10,);

επειδή Το TMemo δεν καταλαβαίνει την ετικέτα αλλαγής γραμμής "
", θα χρησιμοποιήσουμε τη συνάρτηση " " για να την αντικαταστήσουμε με κατανοητές αλλαγές γραμμής "#13#10".

Όταν ολοκληρωθούν όλα, διαγράψτε τη μνήμη από το αντικείμενο DataPost με τη γραμμή:

datapost.Free;

Αν και στο παράδειγμά μας αυτό θα συμβεί αυτόματα στο τέλος της διαδικασίας, αλλά και πάλι...

Το πραγματικό αποτέλεσμα του προγράμματος στην οθόνη:

Έτσι, μπορούμε να στείλουμε όσα δεδομένα ή αρχεία θέλουμε στον διακομιστή, να επεξεργαστούμε αυτά τα δεδομένα στον διακομιστή και να αναφέρουμε στην εφαρμογή το αποτέλεσμα του σεναρίου. Θα μπορούσε ακόμη και να είναι μόνο 0 ή 1, κάτι που θα δώσει σήμα στην εφαρμογή να αντιδράσει περαιτέρω.

Ολα. Καλή τύχη σε όλους. Ελπίζω ότι οι πληροφορίες ήταν χρήσιμες και θα τις χρησιμοποιήσετε.

Μπορείτε να κατεβάσετε το ολοκληρωμένο παράδειγμα και το σενάριο.

Κωδικός πλήρους ενότητας:

Μονάδα PostUnit; Η διασύνδεση χρησιμοποιεί Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdBaseComponent, IdComponent, IdTCPlictionP, IdTCPdC IdHTTP, IdMultipartFormData, Vcl.ExtDlgs; τύπος TForm1 = class(TForm) IdHTTP1: TIdHTTP; τίτλος: TEdit; περιεχόμενο: TMemo; PostBut: TButton; απάντηση: TMemo; Label1: TLabel; Label2: TLabel; Label3: TLabel; imgfile:TEdit; chkfile: TButton; Label4: TLabel; CheckBox1: TCcheckBox; PictDialog:TOpenDialog; διαδικασία PostButClick(Αποστολέας: TObject); διαδικασία chkfileClick(Αποστολέας: TObject); διαδικασία CheckBox1Click(Αποστολέας: TObject); ιδιωτικές ( Ιδιωτικές δηλώσεις ) δημόσιο ( Δημόσιες δηλώσεις ) τέλος; var Form1: TForm1; διαδικασία υλοποίησης ($R *.dfm) TForm1.CheckBox1Click(Sender: TObject); έναρξη //κάνει ενεργά ή ανενεργά τα στοιχεία διαδρομής του αρχείου και τα κουμπιά διαλόγου imgfile.Enabled:=CheckBox1.Checked; chkfile.Enabled:=CheckBox1.Checked; τέλος; διαδικασία TForm1.chkfileClick(Sender: TObject); ξεκινήστε //άνοιξε το παράθυρο διαλόγου και εισαγάγετε την πλήρη διαδρομή προς το αρχείο στο imgfile(TEdit) εάν PictDialog.Execute τότε imgfile.Text:= PictDialog.FileName; τέλος; διαδικασία TForm1.PostButClick(Αποστολέας: TObject); var dataPost:TIdMultiPartFormDataStream; start dataPost:=TIdMultiPartFormDataStream.Create; dataPost.AddFormField("title",title.Text,"utf-8").ContentTransfer:= "8bit"; dataPost.AddFormField("content",content.Text,"utf-8").ContentTransfer:= "8bit"; if CheckBox1.Checked και (trim(imgfile.Text)="") τότε //ελέγξετε εάν το αρχείο είναι επιλεγμένο ή όχι ξεκινά το ShowMessage("Πρέπει να επιλέξετε ένα αρχείο γραφικών!"); έξοδος; τέλος; αν CheckBox1.Checked τότε dataPost.AddFile("file",imgfile.Text,""); //προσθέστε ένα πεδίο με την απάντηση αρχείου.Text:= StringReplace(idHTTP1.Post("http://api..php",dataPost)"
",#13#10,); datapost.Free; end; end.