Εισαγωγή στο Indy. Ανάπτυξη εφαρμογών πελάτη-διακομιστή χρησιμοποιώντας το Indy στους Δελφούς

Συστατικά 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 Servers είναι ζεύγη που αντιστοιχούν στα τμήματα πελάτη και διακομιστή των πρωτοκόλλων και υπηρεσιών (με εξαίρεση ορισμένα, κυρίως διακομιστή, στοιχεία όπως TunnelMaster και TunnelSlave) και επιτρέπουν τη χρήση πρωτοκόλλων όπως το TCP/IP , UDP, NNTP, SMTP, FTP, HTTP, καθώς και υπηρεσίες ECHO, FINGER, WHOIS κ.λπ.

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

TIdTCPClient και TIdTCPServer

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

TIdHostNameServer

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

TIdHTTP και TIdHTTPSserver

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

TIdIcmpClient

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

Ένα στοιχείο πελάτη που έχει σχεδιαστεί για να παρέχει το Πρωτόκολλο Post Office (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 υποστηρίζουν multithreading.

Τα στοιχεία 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; // Εκτελέστε την εργασία του διακομιστή εδώ // εάν δεν υπάρχει εξαίρεση, // γράψτε την απάντηση του διακομιστή, εκτός από το e: Exception do start WriteLn (e.Message); //δοκιμάστε εκτός από το τέλος Αποσύνδεση.

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

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

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

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

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

Έτσι, ξεκινάμε την ανάπτυξη μιας εφαρμογής με αρχιτεκτονική τριών επιπέδων. Για να δημιουργήσετε έναν διακομιστή βάσης δεδομένων χρησιμοποιώντας στοιχεία 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, ολοκληρώστε πρώτα αυτήν τη διαδικασία.

Εισαγωγή στο Indy

Εισαγωγή στο Indy
Δημοσιεύτηκε από τον Chad Z. Hower
Αρχική σελίδα: http://www.atozedsoftware.com
Μετάφραση: Ανατόλι Ποντγκορέτσκι
εισαγωγή
Έγραψα αυτό το άρθρο όταν τρέχουσα έκδοσηήταν το Indy 8.0. Μεγάλο μέρος αυτού του άρθρου είναι εφαρμόσιμο και πολύ χρήσιμο σε μελλοντικές εκδόσεις του Indy. Αν σας άρεσε αυτό το άρθρο και θέλετε να διαβάσετε περισσότερα σε βάθος άρθρα, τότε ρίξτε μια ματιά στο βιβλίο Indy in Depth.
Το Indy εκτελείται σε λειτουργία αποκλεισμού
Το Indy χρησιμοποιεί μπλοκαρισμένες πρίζες. Η λειτουργία αποκλεισμού είναι παρόμοια με την ανάγνωση-εγγραφή αρχείου. Κατά την ανάγνωση ή την εγγραφή δεδομένων, η λειτουργία δεν επιστρέφει τον έλεγχο μέχρι να ολοκληρωθεί η λειτουργία. Η διαφορά από την εργασία με αρχεία είναι ότι η κλήση μπορεί να διαρκέσει περισσότερο, καθώς τα ζητούμενα δεδομένα δεν υπάρχουν ακόμα, αυτό εξαρτάται από την ταχύτητα με την οποία λειτουργεί το δίκτυο ή το μόντεμ σας.
Για παράδειγμα, μια μέθοδος απλώς καλείται και περιμένει μέχρι να επιστρέψει ο έλεγχος στο σημείο κλήσης. Εάν η κλήση ήταν επιτυχής, ο έλεγχος θα επιστραφεί από τη μέθοδο, εάν παρουσιαστεί σφάλμα, θα δημιουργηθεί μια εξαίρεση.
Το lockdown δεν είναι μοιραίο
Λόγω της λειτουργίας μπλοκαρίσματος, έχουμε νικηθεί από τους αντιπάλους μας πολλές φορές, αλλά η λειτουργία μπλοκαρίσματος δεν είναι ο διάβολος.
Το πρόβλημα εμφανίστηκε μετά τη μεταφορά του Winsock στα Windows. Στο Unix, το πρόβλημα τυπικά επιλύθηκε με διχάλωση (παρόμοιο με το multi-threading, αλλά με ξεχωριστές διεργασίες αντί για νήματα). Οι πελάτες Unix και οι δαίμονες έπρεπε να διαχωρίσουν τις διεργασίες που έπρεπε να εκτελούνται και να χρησιμοποιήσουν τη λειτουργία αποκλεισμού. Τα Windows 3.x δεν μπορούσαν να παραλληλιστούν και δεν υποστήριζαν πολύ threading. Η χρήση μιας διεπαφής αποκλεισμού πάγωσε τη διεπαφή χρήστη και έκανε τα προγράμματα να μην ανταποκρίνονται. Επομένως, στο WinSock προστέθηκαν λειτουργίες μη αποκλεισμού, επιτρέποντας στα Windows 3.x με τους περιορισμούς του να χρησιμοποιούν το Winsock χωρίς να αποκλείουν το κύριο και μοναδικό νήμα του προγράμματος. Αυτό απαιτούσε διαφορετικό προγραμματισμό, και η Microsoft και άλλοι υβρίζουν με πάθος τις λειτουργίες αποκλεισμού για να καλύψουν τις αδυναμίες των Windows 3.x.
Στη συνέχεια ήρθε το Win32, το οποίο ήταν σε θέση να υποστηρίξει multi-threading. Αλλά εκείνη τη στιγμή, ο εγκέφαλός τους ήταν ήδη μπερδεμένος (δηλαδή, οι προγραμματιστές θεωρούσαν ότι το μπλοκάρισμα των πριζών ήταν δημιουργία του διαβόλου) και ήταν ήδη δύσκολο να αλλάξουν αυτό που είχαν κάνει. Ως εκ τούτου, η ύβρη των καθεστώτων αποκλεισμού συνεχίζεται.
Στην πραγματικότητα, το Unix έχει μόνο μπλοκαρίσματα. Οι πρίζες μπλοκαρίσματος έχουν επίσης τα πλεονεκτήματά τους και είναι πολύ καλύτερες για πολλαπλές σπειρώσεις, ασφάλεια και άλλες πτυχές. Ορισμένες επεκτάσεις έχουν προστεθεί στο Unix για μη μπλοκαρισμένες υποδοχές. Ωστόσο, λειτουργούν πολύ διαφορετικά από ότι στα Windows. Είναι επίσης μη τυποποιημένα και όχι πολύ συνηθισμένα. Οι υποδοχές αποκλεισμού στο Unix χρησιμοποιούνται σχεδόν σε όλες τις περιπτώσεις και θα συνεχίσουν να χρησιμοποιούνται.
Πλεονεκτήματα της λειτουργίας μπλοκαρίσματος· Πιο εύκολο στον προγραμματισμό - Οι λειτουργίες μπλοκαρίσματος είναι πιο εύκολο να προγραμματιστούν. Όλος ο κώδικας χρήστη μπορεί να βρίσκεται σε ένα μέρος και να εκτελείται με φυσική, διαδοχική σειρά. ·Ευκολότερη μεταφορά στο Unix - Εφόσον το Unix χρησιμοποιεί αποκλειστικές υποδοχές, ο φορητός κώδικας είναι ευκολότερος να γραφεί σε αυτήν την περίπτωση. Το Indy χρησιμοποιεί αυτό το γεγονός για να γράψει ενιαίο κώδικα. ·Είναι πιο βολικό να εργάζεστε με νήματα - Δεδομένου ότι οι πρίζες μπλοκαρίσματος έχουν μια σειρά που αποκτάται από την κληρονομικότητα, επομένως είναι πολύ εύκολες στη χρήση σε νήματα.
Μειονεκτήματα της λειτουργίας αποκλεισμού · Η διεπαφή χρήστη παγώνει στους πελάτες - Μια κλήση αποκλειστικής υποδοχής δεν επιστρέφει τον έλεγχο μέχρι να ολοκληρώσει την εργασία της. Όταν μια τέτοια κλήση γίνεται στο κύριο νήμα της εφαρμογής, η εφαρμογή δεν μπορεί να επεξεργαστεί μηνύματα χρήστη. Αυτό προκαλεί το πάγωμα της διεπαφής χρήστη, τη μη ανανέωση των παραθύρων και την επεξεργασία άλλων μηνυμάτων έως ότου επιστραφεί ο έλεγχος από την υποδοχή αποκλεισμού.
Εξάρτημα TIdAntiFreeze
Το Indy έχει ένα ειδικό εξάρτημα που λύνει το πρόβλημα του παγώματος διεπαφή χρήστη. Απλώς προσθέστε ένα στοιχείο TIdAntiFreeze οπουδήποτε στην εφαρμογή σας και μπορείτε να πραγματοποιήσετε κλήσεις αποκλεισμού χωρίς να παγώσετε τη διεπαφή χρήστη.
Το TIdAntiFreeze εκτελείται σε ένα εσωτερικό χρονόμετρο έξω από τη στοίβα κλήσεων και καλεί το Application.ProcessMessages όταν λήξει το χρονικό όριο. Οι εξωτερικές κλήσεις προς το Indy εξακολουθούν να αποκλείονται και επομένως λειτουργούν ακριβώς όπως χωρίς τη χρήση του στοιχείου TIdAntiFreeze. Η χρήση του TIdAntiFreeze σάς επιτρέπει να έχετε όλα τα πλεονεκτήματα του μπλοκαρίσματος υποδοχών, χωρίς κανένα από τα μειονεκτήματα.
Νήματα κώδικα (Νήματα)
Με αποκλειστικές υποδοχές, χρησιμοποιούνται σχεδόν πάντα ροές κώδικα. Οι μη μπλοκαρισμένες υποδοχές μπορούν επίσης να χρησιμοποιούν νήματα, αλλά αυτό απαιτεί κάποια πρόσθετη επεξεργασίακαι τα πλεονεκτήματά τους σε αυτή την περίπτωση χάνονται σε σύγκριση με τις πρίζες που μπλοκάρουν.
Πλεονεκτήματα των νημάτων·Ορισμός προτεραιοτήτων - Οι προτεραιότητες των μεμονωμένων νημάτων μπορούν να διαμορφωθούν. Αυτό επιτρέπει σε μεμονωμένες εργασίες να κατανέμεται περισσότερο ή λιγότερο χρόνο CPU. ·Ενθυλάκωση - Κάθε σύνδεση μπορεί να περιέχει κάποια ομοιότητα μιας διεπαφής με μια άλλη σύνδεση. ·Ασφάλεια - Κάθε νήμα μπορεί να έχει διαφορετικά χαρακτηριστικά ασφαλείας. ·Πολλαπλοί επεξεργαστές - παρέχει πλεονέκτημα σε συστήματα με πολλούς επεξεργαστές. ·Δεν χρειάζεται σειριοποίηση - παρέχει πλήρη ταυτοποίηση. Χωρίς πολύ νήμα, όλα τα αιτήματα πρέπει να υποβάλλονται σε επεξεργασία σε ένα νήμα. Επομένως, κάθε εργασία πρέπει να χωριστεί σε μικρά κομμάτια, ώστε να μπορεί να λειτουργήσει γρήγορα. Ενώ εκτελείται ένα μπλοκ, όλοι οι άλλοι αναγκάζονται να περιμένουν να τελειώσει. Στο τέλος ενός μπλοκ, εκτελείται το επόμενο κ.ο.κ. Με το multithreading, κάθε εργασία μπορεί να προγραμματιστεί ως μια ενιαία μονάδα και το λειτουργικό σύστημα κατανέμει χρόνο σε όλες τις εργασίες.
Νήματα δημοσκόπησης
Η δημιουργία και η καταστροφή νημάτων απαιτεί μεγάλη ένταση πόρων. Αυτό είναι ένα ιδιαίτερα δύσκολο έργο για διακομιστές που έχουν βραχύβιες συνδέσεις. Κάθε διακομιστής δημιουργεί ένα νήμα, το χρησιμοποιεί για μικρό χρονικό διάστημα και στη συνέχεια το καταστρέφει. Αυτό έχει ως αποτέλεσμα τα νήματα να δημιουργούνται και να διαγράφονται πολύ συχνά. Ένα παράδειγμα αυτού είναι ένας διακομιστής Web. Αποστέλλεται ένα μόνο αίτημα και επιστρέφεται μια απλή απάντηση. Όταν χρησιμοποιείτε ένα πρόγραμμα περιήγησης, μπορούν να προκύψουν εκατοντάδες συνδέσεις και αποσυνδέσεις κατά την προβολή οποιουδήποτε ιστότοπου.
Τα νήματα δημοσκοπήσεων μπορούν να διορθώσουν αυτήν την κατάσταση. Αντί να δημιουργούνται και να καταστρέφονται νήματα κατά παραγγελία, τα νήματα επιλέγονται από μια λίστα αχρησιμοποίητων αλλά ήδη δημιουργημένων νημάτων από το pool. Όταν ένα νήμα δεν χρειάζεται πλέον, επιστρέφεται στην πισίνα αντί να καταστραφεί. Τα νήματα στο pool επισημαίνονται ως αχρησιμοποίητα και επομένως δεν καταναλώνουν χρόνο CPU. Για ακόμη μεγαλύτερη βελτίωση, τα νήματα μπορούν να προσαρμοστούν δυναμικά στις τρέχουσες ανάγκες του συστήματος.
Το Indy υποστηρίζει δημοσκόπηση νήματος. Η ομάδα νημάτων στο Indy είναι προσβάσιμη μέσω του στοιχείου TIdThreadMgrPool.
Πολλά νήματα
Ένας πολύ φορτωμένος διακομιστής μπορεί να απαιτεί εκατοντάδες ή ακόμα και χιλιάδες νήματα. Υπάρχει μια κοινή πεποίθηση ότι εκατοντάδες και χιλιάδες νήματα μπορούν να σκοτώσουν το σύστημά σας. Αυτή είναι μια ψευδής πεποίθηση.
Στους περισσότερους διακομιστές, τα νήματα περιμένουν δεδομένα. Κατά την αναμονή μιας κλήσης αποκλεισμού, το νήμα είναι ανενεργό. Σε έναν διακομιστή με 500 νήματα, μόνο 50 μπορούν να είναι ενεργά ταυτόχρονα.
Ο αριθμός των νημάτων που εκτελούνται στο σύστημά σας μπορεί να σας εκπλήξει. Με έναν ελάχιστο αριθμό διακομιστών σε λειτουργία και τον καθορισμένο εκτελούμενες εφαρμογέςΤο σύστημά μου έχει δημιουργηθεί 333 νήματα, ακόμη και με 333 νήματα η CPU είναι φορτωμένη μόνο κατά 1%. Βαριά φορτωμένο Διακομιστής IIS(Microsoft Internet Information Server) μπορεί να δημιουργήσει εκατοντάδες και χιλιάδες νήματα.
Νήματα και καθολικές ενότητες
Με πολλά νήματα, πρέπει να διασφαλίσετε την ακεραιότητα των δεδομένων κατά την πρόσβαση σε αυτά. Αυτό μπορεί να είναι δύσκολο για προγραμματιστές που δεν έχουν εργαστεί με νήματα. Αλλά γενικά, οι περισσότεροι διακομιστές δεν χρειάζεται να χρησιμοποιούν καθολικά δεδομένα. Οι περισσότεροι διακομιστές εκτελούν μεμονωμένες λειτουργίες. Κάθε νήμα εκτελεί τη δική του απομονωμένη εργασία. Οι καθολικές ενότητες ανάγνωσης/εγγραφής είναι χαρακτηριστικό πολλών εφαρμογών πολλαπλών νημάτων, αλλά δεν είναι τυπικές για διακομιστές.
Μεθοδολογία Indy
Το Indy είναι διαφορετικό από άλλα εξαρτήματα Winsock στα οποία έχετε συνηθίσει. Εάν έχετε εργαστεί με άλλα εξαρτήματα, τότε η καλύτερη λύσηθα ξεχάσουν πώς λειτουργούν. Πολλά άλλα στοιχεία χρησιμοποιούν μη αποκλειστικές (ασύγχρονες) κλήσεις και λειτουργούν ασύγχρονα. Πρέπει να αντιδρούν σε γεγονότα, να δημιουργήσουν μια μηχανή κατάστασης και να εκτελούν συχνούς βρόχους αναμονής.
Για παράδειγμα, με άλλα στοιχεία, όταν καλείτε μια σύνδεση, πρέπει είτε να περιμένετε να συμβεί το συμβάν σύνδεσης είτε να περιμένετε σε βρόχο για μια ιδιότητα να υποδεικνύει ότι η σύνδεση έχει πραγματοποιηθεί. Με το Indy, μπορείτε να καλέσετε τη μέθοδο Connect και να περιμένετε να επιστρέψει. Θα εκδοθεί επιστροφή χρημάτων εάν η σύνδεση είναι επιτυχής ή δημιουργηθεί εξαίρεση εάν υπάρχει πρόβλημα. Επομένως, η εργασία με το Indy μοιάζει πολύ με την εργασία με αρχεία. Το Indy σάς επιτρέπει να τοποθετήσετε όλο τον κώδικά σας σε ένα μέρος, αντί να τον διαδώσετε σε διαφορετικά συμβάντα. Επιπλέον, το Indy είναι πολύ απλό και πιο βολικό όταν εργάζεστε με νήματα.
Πόσο διαφορετικό είναι το Indy;
Σύντομη επισκόπηση · Χρησιμοποιούνται κλήσεις αποκλεισμού · Δεν είναι προσανατολισμένες σε γεγονότα - υπάρχουν εκδηλώσεις, αλλά χρησιμοποιούνται για ενημερωτικές ανάγκες και δεν απαιτούνται πραγματικά. ·Σχεδιασμένο για νήματα - Το Indy έχει σχεδιαστεί για νήματα, αλλά μπορεί να χρησιμοποιηθεί χωρίς νήματα. Διαδοχικός προγραμματισμός
Αναλυτική κριτική
Το Indy όχι μόνο χρησιμοποιεί αποκλεισμό κλήσεων (σύγχρονες) αλλά λειτουργεί και έτσι. Μια τυπική συνεδρία Indy μοιάζει με αυτό:
ξεκινήστε με το IndyClient
Συνδέω-συωδεομαι; Δοκιμάστε
// Κάνε τα πράγματά σου εδώ
τελικά Αποσύνδεση? τέλος;
τέλος;
Με άλλα εξαρτήματα μοιάζει με αυτό:
διαδικασία TFormMain.TestOnClick(Αποστολέας: TComponent);
αρχίζουν
με το SocketComponent ξεκινήστε
Συνδέω-συωδεομαι; δοκιμάστε
ενώ δεν είστε Συνδεδεμένοι ξεκινήστε
εάν IsError τότε ξεκινήστε
Αμβλώνω;
τέλος;

OutData:= "Δεδομένα προς αποστολή";
ενώ ξεκινά το μήκος (OutData) > 0
Application.ProcessMessages;
τέλος;
τελικά Αποσύνδεση? τέλος;
τέλος;
τέλος;
διαδικασία TFormMain.OnConnectError;
αρχίζουν
IsError:= True;
τέλος;
διαδικασία TFormMain.OnRead;
var
i: Ακέραιος αριθμός;
αρχίζουν
i:= SocketComponent.Send(OutData);
OutData:= Copy(OutData, i + 1, MaxInt);
τέλος;
Πολλά στοιχεία δεν κάνουν πολύ καλή δουλειά στην απομόνωση του προγραμματιστή από τη στοίβα. Πολλά στοιχεία, αντί να απομονώνουν τον χρήστη από την πολυπλοκότητα της στοίβας, απλώς αφήνουν τον χρήστη σε αυτό ή παρέχουν ένα περιτύλιγμα πάνω από τη στοίβα.
Indy ιδιαίτερος τρόπος
Το Indy έχει σχεδιαστεί από την αρχή για να είναι πολλαπλών νημάτων. Η δημιουργία διακομιστών και πελατών στο Indy είναι παρόμοια με τη δημιουργία διακομιστών και πελατών στο Unix. Οι εφαρμογές Unix συνήθως καλούν τη στοίβα απευθείας με ελάχιστο ή καθόλου στρώμα αφαίρεσης.
Συνήθως, οι διακομιστές Unix έχουν μία ή περισσότερες διαδικασίες ακρόασης που παρακολουθούν τα εισερχόμενα αιτήματα πελατών. Για κάθε πελάτη που πρέπει να εξυπηρετηθεί, α νέα διαδικασία. Αυτό κάνει τον προγραμματισμό απλό, κάθε διαδικασία για έναν μόνο πελάτη. Κάθε διαδικασία εκτελείται στο δικό της πλαίσιο ασφαλείας, το οποίο ορίζεται από τη διαδικασία ή τη διαδικασία ακρόασης με βάση τα υπάρχοντα δικαιώματα, την ταυτότητα ή άλλα πράγματα.
Οι διακομιστές Indy λειτουργούν σχεδόν με τον ίδιο τρόπο. Τα Windows, σε αντίθεση με το Unix, δεν μπορούν να πολλαπλασιάσουν καλά τις διεργασίες, αλλά λειτουργούν καλά με τα νήματα. Οι διακομιστές Indy δημιουργούν ένα ξεχωριστό νήμα για κάθε σύνδεση πελάτη.
Οι διακομιστές Indy εκχωρούν ένα νήμα ακρόασης που είναι ξεχωριστό από το κύριο νήμα κώδικα του προγράμματος. Το νήμα ακρόασης ακούει τα εισερχόμενα αιτήματα από πελάτες. Για κάθε πελάτη στον οποίο ανταποκρίνεται, δημιουργείται ένα νέο νήμα για την εξυπηρέτηση του πελάτη. Στη συνέχεια, τα αντίστοιχα συμβάντα εξυπηρετούνται στο πλαίσιο αυτού του ρεύματος.
Κριτική πελατών Indy
Το Indy έχει σχεδιαστεί για να παρέχει ένα πολύ υψηλό επίπεδο αφαίρεσης. Η πολυπλοκότητα και οι λεπτομέρειες της στοίβας TCP/IP είναι κρυμμένες από τον προγραμματιστή Συνήθως, μια τυπική περίοδος λειτουργίας πελάτη στο Indy μοιάζει με αυτό:
ξεκινήστε με το IndyClient
Κεντρικός υπολογιστής:= "zip.pbe.com"; // Κεντρικός υπολογιστής για κλήση
Λιμάνι:= 6000; // Θύρα για ενεργοποίηση του διακομιστή
Συνδέω-συωδεομαι; Δοκιμάστε
// Κάνε τα πράγματά σου εδώ
τελικά Αποσύνδεση? τέλος;
τέλος;
Επισκόπηση διακομιστή Indy
Τα στοιχεία διακομιστή Indy δημιουργούν ένα νήμα ακρόασης που είναι απομονωμένο από το κύριο νήμα κώδικα του προγράμματος. Το νήμα ακρόασης ακούει τα εισερχόμενα αιτήματα από πελάτες. Για κάθε πελάτη στον οποίο ανταποκρίνεται, δημιουργείται ένα νέο νήμα για την εξυπηρέτηση του πελάτη. Στη συνέχεια, τα αντίστοιχα συμβάντα εξυπηρετούνται στο πλαίσιο αυτού του νήματος.

Πρακτικά παραδείγματα
Τα ακόλουθα παραδείγματα θα σας βοηθήσουν να ξεκινήσετε με τα στοιχεία για εύχρηστος, αλλά για να δείξουμε παραδείγματα που έγιναν όπως απλές εφαρμογές. Μερικά έργα γίνονται για να δείξουν διαφορετικές καταστάσεις. Αυτά τα παραδείγματα είναι επίσης διαθέσιμα για λήψη ως αρχεία zip.
Σημείωση από τον μεταφραστή: ο σύνδεσμος στον ιστότοπο δεν λειτουργεί.
Παράδειγμα 1 - Επαλήθευση ταχυδρομικού κώδικα
Το πρώτο έργο γίνεται όσο πιο απλό γίνεται. Αναζήτηση με ταχυδρομικό κώδικα, ο πελάτης ρωτά τον διακομιστή σε ποια πόλη και πολιτεία ανήκει ο καθορισμένος ταχυδρομικός κώδικας.
Για όσους ζουν εκτός των ΗΠΑ και δεν γνωρίζουν τι είναι ο ταχυδρομικός κώδικας, είναι ένας ταχυδρομικός κώδικας που υποδεικνύει την τοποθεσία παράδοσης. Οι ταχυδρομικοί κώδικες αποτελούνται από 5 ψηφία.
Πρωτόκολλο
Το πρώτο βήμα στη δημιουργία ενός διακομιστή και ενός πελάτη είναι η ανάπτυξη ενός πρωτοκόλλου. Για τυπικά πρωτόκολλα, αυτό ορίζεται από το αντίστοιχο RFC. Για τον ταχυδρομικό κώδικα, το πρωτόκολλο ορίζεται παρακάτω.
Τα περισσότερα πρωτόκολλα επικοινωνίας λειτουργούν σε λειτουργία κειμένου. Ανταλλαγή σημαίνει ότι μεταδίδεται μια εντολή και ως απόκριση, η κατάσταση και πιθανώς δεδομένα. Τα πρωτόκολλα δεν περιορίζονται στην ανταλλαγή, αλλά εξακολουθεί να χρησιμοποιείται απλό κείμενο. Το πρωτόκολλο για τον προσδιορισμό του ταχυδρομικού κώδικα βασίζεται επίσης σε κείμενο. Το απλό κείμενο διευκολύνει τον εντοπισμό σφαλμάτων στα πρωτόκολλα και επιτρέπει σε διαφορετικές γλώσσες προγραμματισμού και λειτουργικά συστήματα να επικοινωνούν.
Μετά τη σύνδεση, ο διακομιστής στέλνει ένα μήνυμα γεια και, στη συνέχεια, αποδέχεται την εντολή. Αυτή η εντολή μπορεί να είναι "ZipCode x" (Όπου x είναι ο ταχυδρομικός κώδικας) ή "Quit". Σε απάντηση στην εντολή ZipCode, αποστέλλεται μια απάντηση με τη μορφή μιας γραμμής με την απάντηση ή κενή γραμμήαν δεν βρεθεί ο κωδικός. Η εντολή Quit κάνει τον διακομιστή να κλείσει τη σύνδεση. Ο διακομιστής μπορεί να δεχτεί πολλές εντολές πριν αποσταλεί η εντολή Quit.
Πηγαίος κώδικας διακομιστή

μονάδα ServerMain;

διεπαφή

χρήσεις

τύπος

TformMain = κλάση (TForm)

IdTCPServer1: TIdTCPServer;

διαδικασία FormCreate(Αποστολέας: TObject ) ;

διαδικασία FormDestroy(Αποστολέας: TObject ) ;

διαδικασία IdTCPServer1Connect(AThread: TIdPeerThread) ;

ιδιωτικός

ZipCodeList: TStrings;

δημόσιο

τέλος ;

FormMain: TformMain;

εκτέλεση

(R*.DFM)

διαδικασία TformMain.IdTCPServer1Connect (AThread: TIdPeerThread) ;

αρχίζουν

AThread.Connection .WriteLn ( "Indy Zip Code Server Ready." ) ;

τέλος ;

SCCommand: string ;

αρχίζουν

SCCommand:= ReadLn ;

τέλος ;

τέλος ;

τέλος ;

διαδικασία TformMain.FormCreate (Αποστολέας: TObject ) ;

αρχίζουν

ZipCodeList:= TStringList.Create ;

ZipCodeList.LoadFromFile(ExtractFilePath(Application.EXEName) + "ZipCodes.dat");

τέλος ;

διαδικασία TformMain.FormDestroy (Αποστολέας: TObject ) ;

αρχίζουν

ZipCodeList.Free ;

τέλος ;

τέλος.

Τα μόνα τμήματα του έργου ειδικά για το Indy είναι το στοιχείο IdTCPServer1, οι μέθοδοι IdTCPServer1Connect και IdTCPServer1Execute.
Η φόρμα περιέχει το στοιχείο IdTCPServer1 του τύπου TIdTCPServer. Οι ακόλουθες ιδιότητες έχουν αλλάξει: ·Ενεργό = True - Μετά την εκκίνηση της εφαρμογής, ο διακομιστής ακούει. ·DefaultPort = 6000 - Τιμή θύρας για αυτό το έργο. Ο διακομιστής ακούει για αιτήματα πελάτη σε αυτήν τη θύρα.
Η μέθοδος IdTCPServer1Execute σχετίζεται με το συμβάν OnExecute του διακομιστή. Το συμβάν OnExecute αυξάνεται μετά την αποδοχή της σύνδεσης πελάτη. Το συμβάν OnExecute είναι διαφορετικό από άλλα συμβάντα που γνωρίζετε. Το OnExecute εκτελείται στο πλαίσιο ενός νήματος. Το συμβάν νήματος ανυψώνεται και δίνεται το όρισμα AThread που μεταβιβάζεται στη μέθοδο. Αυτό είναι σημαντικό επειδή πολλά συμβάντα OneExecute μπορούν να εκτελεστούν ταυτόχρονα. Αυτό γίνεται έτσι ώστε ο διακομιστής να μπορεί να λειτουργεί χωρίς τη δημιουργία νέου στοιχείου. Υπάρχουν επίσης μέθοδοι που μπορούν να παρακαμφθούν κατά την κατασκευή κληρονόμων.
Το συμβάν OnConnect ενεργοποιείται αφού γίνει αποδεκτή η σύνδεση και δημιουργηθεί ένα νήμα για αυτό. ΣΕ αυτόν τον διακομιστήΑυτό χρησιμοποιείται για να στείλει ένα μήνυμα καλωσορίσματος στον πελάτη. Εάν θέλετε, αυτό μπορεί επίσης να γίνει στο συμβάν OnExecute.
Το συμβάν OnExecute μπορεί να ενεργοποιηθεί πολλές φορές μέχρι να αποσυνδεθεί ή να χαθεί η σύνδεση. Αυτό εξαλείφει την ανάγκη ελέγχου της σύνδεσης για αποσύνδεση ή απώλεια σε βρόχο μέσα σε ένα συμβάν.
Το IdTCPServer1Execute χρησιμοποιεί δύο βασικές συναρτήσεις, ReadLn και WriteLn. Το ReadLn διαβάζει μια συμβολοσειρά από τη σύνδεση και το WriteLn στέλνει μια συμβολοσειρά στη σύνδεση.
sCommand:= ReadLn;
Ο παραπάνω κώδικας παίρνει μια συμβολοσειρά από τον πελάτη και την τοποθετεί στην τοπική μεταβλητή συμβολοσειράς sCommand.

εάν το SameText (sCommand, "QUIT") τότε ξεκινήστε

τέλος αλλιώς εάν SameText (Αντιγραφή (sCommand, 1 , 8 ) , "Ταχυδρομικός Κώδικας" ) μετά ξεκινήστε

WriteLn(ZipCodeList.Values[Copy(sCommand, 9, MaxInt)]);

τέλος ;


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

μονάδα ClientMain;

διεπαφή

χρήσεις

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, ExtCtrls, IdAntiFreezeBase,

IdAntiFreeze, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient;

τύπος

TformMain = κλάση (TForm)

Πελάτης: TIdTCPClient;

IdAntiFreeze1: TIdAntiFreeze;

Πίνακας 1: TPanel;

Πίνακας 2: TPanel;

MemoInput: TMemo;

LboxResults: TListBox;

Πίνακας 3: TPanel;

Κουμπί 1: TButton;

Κουμπί 2: TButton;

Label1: TLabel;

διαδικασία Button2Click(Αποστολέας: TObject ) ;

διαδικασία Button1Click(Αποστολέας: TObject ) ;

ιδιωτικός

δημόσιο

τέλος ;

FormMain: TformMain;

εκτέλεση

(R*.DFM)

διαδικασία TformMain.Button2Click (Αποστολέας: TObject ) ;

αρχίζουν

MemoInput.Clear ;

LboxResults.Clear ;

τέλος ;

διαδικασία TformMain.Button1Click (Αποστολέας: TObject ) ;

I: ακέραιος ;

S: string ;

αρχίζουν

ButnLookup.Enabled := true ; δοκιμάστε

LboxResults.Clear ;

με τον Πελάτη ξεκινήστε

Συνδέω-συωδεομαι; δοκιμάστε

LboxResults.Items.Add(ReadLn);

για i:= 0 στο memoInput.Lines .Count - 1 αρχίζει

WriteLn("Ταχυδρομικός Κώδικας" + memoInput.Lines[i]);

LboxResults.Items.Add(memoInput.Lines[i]);

S:= ReadLn ;

αν s = "" τότε ξεκινήστε

Σ:= "-- Δεν βρέθηκε καταχώρηση για αυτόν τον ταχυδρομικό κώδικα.";

τέλος ;

LboxResults.Items.Add(s);

LboxResults.Items.Add("");

τέλος ;

WriteLn("Quit");

τελικά Αποσύνδεση? τέλος ;

τέλος ;

τελικά butnLookup.Enabled := true ; τέλος ;

τέλος ;

τέλος.


Τα μόνα τμήματα ειδικά για το στοιχείο πελάτη είναι η μέθοδος Button1Click.
Το στοιχείο Client είναι τύπου TIdTCPClient και τοποθετείται στη φόρμα. Οι ακόλουθες ιδιότητες έχουν αλλάξει: ·Host = 127.0.0.1 - Ο διακομιστής βρίσκεται στον ίδιο υπολογιστή με τον πελάτη. ·Θύρα = 6000 - Θύρα διακομιστή
Η μέθοδος Button1Click σχετίζεται με το συμβάν OnClick του στοιχείου Button1. Όταν κάνετε κλικ στο κουμπί, καλείται αυτή η μέθοδος. Το τμήμα Indy αυτής της μεθόδου μπορεί να μειωθεί στα εξής: 1.Σύνδεση με τον διακομιστή (Σύνδεση;) 1.Διαβάστε τον χαιρετισμό από τον διακομιστή. 1. Για κάθε γραμμή που εισάγεται από τον χρήστη στο TMemo: 1. Αποστολή αιτήματος στον διακομιστή (WriteLn("ZipCode" + memoInput.Lines[i]);) 1. Ανάγνωση μιας απάντησης από τον διακομιστή (s:= ReadLn; ) 1. Αποστολή της εντολής Quit (WriteLn("Quit");) 1.Disconnect (Disconnect;)
Δοκιμές
Αυτό το παράδειγμα έχει δοκιμαστεί και λειτουργεί με εγκατεστημένο το TCP/IP. Μπορείτε να το αλλάξετε ώστε να λειτουργεί μέσω δικτύου από έναν υπολογιστή στον άλλο. Με την εκκίνηση του διακομιστή σε άλλον υπολογιστή και την αλλαγή του ονόματος ή της IP του διακομιστή στον υπολογιστή-πελάτη.
Για να δοκιμάσετε έργα, μεταγλωττίστε και εκτελέστε τον διακομιστή. Στη συνέχεια, μεταγλωττίστε και εκτελέστε τον πελάτη. Εισαγάγετε τον ταχυδρομικό σας κώδικα στο πεδίο σημείωσης και πατήστε το πλήκτρο αναζήτησης.
Εντοπισμός σφαλμάτων
Τα πρωτόκολλα κειμένου είναι πολύ εύκολο να εντοπιστούν σφαλμάτων επειδή μπορούν να δοκιμαστούν χρησιμοποιώντας Telnet. Για να γίνει αυτό, αρκεί να γνωρίζετε τη θύρα διακομιστή. Ο διακομιστής αναζήτησης ταχυδρομικού κώδικα ακούει στη θύρα 6000.
Ξεκινήστε ξανά τον διακομιστή αναζήτησης ταχυδρομικού κώδικα. Στη συνέχεια ανοίξτε μια κονσόλα (π.χ. ένα παράθυρο Dos). Τώρα εισάγετε:
telnet 127.0.0.1 6000
Είστε πλέον συνδεδεμένοι στον διακομιστή. Ορισμένοι διακομιστές στέλνουν επίσης ένα μήνυμα καλωσορίσματος. Κάποιοι όχι. Δεν θα δείτε τις γραμμές που εισάγετε. Οι περισσότεροι διακομιστές δεν ηχούν για να εξοικονομήσουν κίνηση. Ωστόσο, μπορείτε να αλλάξετε τις ρυθμίσεις telnet ορίζοντας την επιλογή "Echo On". Αυτό γίνεται διαφορετικά σε διαφορετικούς πελάτες telnet και ορισμένοι δεν έχουν καθόλου αυτήν τη δυνατότητα. Τώρα εισάγετε:
ταχυδρομικός κώδικας 37642
Θα δείτε την απάντηση του διακομιστή:
ΛΟΦΟΣ ΕΚΚΛΗΣΙΑΣ, TN
Για να αποσυνδεθείτε από τον διακομιστή, εισαγάγετε:
εγκαταλείπω
Παράδειγμα 2 - πρόσβαση στη βάση δεδομένων
Αυτό το παράδειγμα προσομοιώνει έναν διακομιστή που πρέπει να εκτελεί εργασίες αποκλεισμού εκτός των κλήσεων υποδοχής. Πολλοί διακομιστές αναγκάζονται να λειτουργούν σε τέτοιες συνθήκες. Οι διακομιστές που χρειάζονται πρόσβαση στη βάση δεδομένων, καλούν εξωτερικές διαδικασίες ή υπολογισμούς συχνά δεν μπορούν να διακόψουν αυτές τις κλήσεις, επειδή είναι εξωτερικές κλήσεις ή λόγω της πολυπλοκότητας αυτού. Η πρόσβαση στη βάση δεδομένων δεν μπορεί να χωριστεί σε μικρά κομμάτια και ο προγραμματιστής πρέπει να περιμένει το τέλος της λειτουργίας με τη βάση δεδομένων. Αυτό είναι χαρακτηριστικό όχι μόνο των κλήσεων της βάσης δεδομένων, αλλά και άλλων λειτουργιών όπως συμπίεση, υπολογισμοί και άλλη επεξεργασία του ίδιου είδους.
Για λόγους επίδειξης, ας φανταστούμε ότι ο διακομιστής πραγματοποιεί μια κλήση βάσης δεδομένων που διαρκεί 5 δευτερόλεπτα για να ολοκληρωθεί. Για απλοποίηση, ας το κάνουμε αυτό απλά με μια παύση, χρησιμοποιήστε τη συνάρτηση Sleep(5000) για αυτό, αντί να καλέσετε πραγματικά.
Αυτό το παράδειγμα απαιτεί επίσης λιγότερες λεπτομέρειες από το προηγούμενο παράδειγμα, επειδή πολλές από τις έννοιες δεν είναι ακόμη σαφείς.
Πηγή

κύρια μονάδα?

διεπαφή

χρήσεις

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

IdBaseComponent, IdComponent, IdTCPServer.

τύπος

TformMain = κλάση (TForm)

IdTCPServer1: TIdTCPServer;

διαδικασία IdTCPServer1Execute(AThread: TIdPeerThread) ;

ιδιωτικός

δημόσιο

τέλος ;

FormMain: TformMain;

εκτέλεση

(R*.DFM)

διαδικασία TformMain.IdTCPServer1Execute (AThread: TIdPeerThread) ;

I: ακέραιος ;

αρχίζουν

με το AThread. Η σύνδεση αρχίζει

WriteLn("Γεια. Ο διακομιστής DB έτοιμος.");

I:= StrToIntDef(ReadLn, 0);

// Η αναστολή λειτουργίας αντικαθιστά μια μεγάλη κλήση DB ή άλλη κλήση

Ύπνος (5000);

WriteLn(IntToStr(i * 7));

τέλος ;

τέλος ;

τέλος.

Επειδή το συμβάν Execute εμφανίζεται στο πλαίσιο ενός νήματος, ο κώδικας επεξεργασίας μπορεί να έχει οποιοδήποτε μήκος. Κάθε πελάτης έχει το δικό του νήμα και δεν αποκλείει άλλους πελάτες.
Δοκιμές
Για να δοκιμάσετε τον διακομιστή DB, μεταγλωττίστε και εκτελέστε τον. Συνδεθείτε σε αυτό χρησιμοποιώντας Telnet στη θύρα 6001. Ο διακομιστής θα απαντήσει με ένα μήνυμα καλωσορίσματος. Εισάγετε αριθμό. Ο διακομιστής θα «επεξεργαστεί» το αίτημά σας και θα απαντήσει εντός 5 δευτερολέπτων.

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

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

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

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

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

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

TIdTCPClient και TIdTCPServer

Αυτά τα στοιχεία χρησιμοποιούνται για την υποστήριξη ενός από τα κύρια πρωτόκολλα δικτύου - 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

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

TIdFTP

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

TIdGopher και TIdGopherServer

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

TIdHostNameServer

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

TIdHTTP και TIdHTTPSserver

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

TIdIcmpClient

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

TIdPOP3

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

TIdIMAP4Server

Ένα στοιχείο διακομιστή σχεδιασμένο να υποστηρίζει λειτουργίες IMAP (Internet Message Access Protocol) στον διακομιστή. Το πρωτόκολλο σάς επιτρέπει να αναζητάτε μηνύματα email στο διακομιστή. Η διαφορά μεταξύ των πρωτοκόλλων 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

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

TIdSMTP

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

TIdSNTP

Ένα στοιχείο πελάτη σχεδιασμένο να παρέχει 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 υποστηρίζουν multithreading.

Τα στοιχεία 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 μέσω διακομιστή αλληλογραφίας Internet
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, η οποία χρησιμοποιείται από προεπιλογή από διακομιστές Web, η εφαρμογή θα απαντήσει με το κείμενο που φαίνεται στην Εικ. 6, στην περίπτωση των Windows 2000 OS και IIS 5.0.

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

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

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

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

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

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

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

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

Έτσι, ξεκινάμε την ανάπτυξη μιας εφαρμογής με αρχιτεκτονική τριών επιπέδων. Για να δημιουργήσετε έναν διακομιστή βάσης δεδομένων χρησιμοποιώντας στοιχεία 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, ολοκληρώστε πρώτα αυτήν τη διαδικασία.
  6. Ορίστε την ιδιότητα SQLConnection της κλάσης SQLDataSet σε SQLConnection1 και εκχωρήστε την ιδιότητα CommandText στην πρόταση SQL: επιλέξτε CUSTOMER, CONTACT_FIRST, CONTACT_LAST από τον CUSTOMER όπου CUST_NO = :cust.

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

Κατά την ανάπτυξη του επόμενου έργου Ιστού, προέκυψε η εργασία - να εφαρμοστεί λογισμικό πελάτη στους Δελφούς, το οποίο θα μετέφερε δεδομένα στον διακομιστή χρησιμοποιώντας τη μέθοδο 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" ] / /λάβετε πληροφορίες σχετικά με το αρχείο (όνομα, επέκταση, κ.λπ.) //Ελέγξτε τον τύπο αρχείου στη λίστα των επιτρεπόμενων τύπων (IMPROVISATION:)) if (stripos("jpgpnggif",$finfo["επέκταση"] )==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 and (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.

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

Αυτό το άρθρο σας δείχνει πώς να δημιουργήσετε μια αυτόνομη υπηρεσία 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 που βασίζεται σε SOAP n-tier.

Είχε εκδοθεί στο παρελθόν από τον 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 θα δημιουργείται κάθε φορά που λαμβάνεται ένα αίτημα. Προφανώς αυτό δεν είναι απαραίτητο. Επομένως, η κλάση μπορεί να τροποποιηθεί για να διασφαλιστεί η μόνιμη δημιουργία αυτού του αντικειμένου εφόσον υπάρχει το αντικείμενο διακομιστή. Συνιστάται να ανατρέξετε στην τεκμηρίωση υλοποίησης της τάξης για περισσότερες πληροφορίες.

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