Σάββατο, 20 Φεβρουαρίου 2016

Εγχειρίδιο της Μ2000 - Τεύχος 14ο

6.3 Παράδειγμα Πελάτη-Εξυπηρετητή.

(LInux: Ίσως σε νεότερη έκδοση του Wine να τρέχει, αλλά προς το παρόν τρέχει μόνο στις εκδόσεις Windows από Xp μέχρι και 10)

Για το παράδειγμα θα χρειαστούμε δυο προγράμματα, το ένα θα είναι ο εξυπηρετητής και το άλλο θα είναι το χαζό τερματικό. Θα το ανοίξουμε δυο φορές, σαν τερματικό 101 και 102.
Θα μπορούσε κανείς να αλλάξει το μέγεθος της φόρμας κάθε εφαρμογής ώστε να είναι και τα τρία σε άμεση θέα. Όμως με Ctrl Tab μπορούμε να αλλάζουμε εύκολα. Επειδή για την εισαγωγή έχει επιλεχθεί ένας τρόπο με αναλογική γραφή, στις αλλαγές πρέπει να επιλέγουμε το "πεδίο" με το ποντίκι και μετά να γράφουμε.
Η υπόθεση έχει ως εξής. Ο εξυπηρετητής καλεί δυο φορές το πρόγραμμα Τερμ1 και το καθένα το ονομάζει, το πρώτο 101 και το άλλο 102. Κάθε Τερματικό στέλνει στον εξυπηρετητή το μήνυμά του (αυτό που γράφουμε) και αυτός μας στέλνει ένα Οκ και έναν αριθμό, ας πούμε πρωτοκόλλου.
Ο εξυπηρετητής καταγράφει στην δική του οθόνη όλα τα μηνύματα "εντολές" για αυτόν, και γράφει μάλιστα από ποιο τερματικό το έλαβε, τι αριθμό πρωτοκόλλου έδωσε και αν πήγε το μήνυμα πίσω!

Επειδή τα τερματικά τα ξεκινάει ο Εξυπηρετητής, πρέπει το πρόγραμμα Τερμ1 να το σώσουμε με τρόπο ώστε όταν το καλούμε να τρέχει. Και τα δύο προγράμματα είναι σχεδιασμένα να σταματούν με ένα τρόπο, ο εξυπηρετητής με οποιοδήποτε πλήκτρο του ποντικιού και ο πελάτης γράφοντας Τέλος (μικρά μεγάλα τόνοι δεν τον πειράζει). Επιπλέον έχω βάλει το ? να στέλνεται από πελάτη και να σταματάει τον εξυπηρετητή.
Και τα δυο προγράμματα (τύποι, γιατί τον πελάτη τον τρέχουμε δυο φορές, μπορούμε και παραπάνω), ξεκινούν πάλι γιατί έχουν κρατήσει με ένα τρόπο αυτό που τους ενδιαφέρει. Ο εξυπηρετητής δεν θέλει να χάσει τον αριθμό πρωτοκόλλου ενώ οι πελάτες θέλουν να κρατήσουν τα βασικά τους στοιχεία, όνομα αυλού, όνομα τερματικού, και κωδικός τερματικού (από τον οποίο λογαριάζουν και τα δυο προγράμματα το όνομα του αυλού).
Σε περίπτωση που θα θέλαμε (και έτσι είναι το σωστό) να τρέξουμε τα προγράμματα πελάτες σε άλλους υπολογιστές, πρέπει να μεταφέρουμε το όνομα του αυλού και να στέλνουμε αντί για κωδικό το όνομα του αυλού για επιστροφή. Το όνομα του αυλού είναι διπλό, έχει το όνομα του υπολογιστή και του αυλού σε εκείνο τον υπολογιστή.
Ο Εξυπηρετητής έχει χρόνο ένα δευτερόλεπτο για να στείλει την απάντηση, από την ώρα που θα αποφασίσει να την στείλει, ενώ ο πελάτης έχει 5 δευτερόλεπτα για να στείλει το μήνυμά του. Οι χρόνοι είναι αυθαίρετοι. Επειδή υπάρχουν πολλοί πελάτες, ο αυλός του εξυπηρετητή θα δέχεται περισσότερο όγκο πληροφοριών. άρα αυτός θα αργεί να "αδειάσει".
Κάθε αυλός αδειάζει το "μερικό" του φορτίο στο αλφαριθμητικό (καμία φορά το χρησιμοποιούμε στην αρχή για είσοδο ονόματος, θα το δείτε, εκεί που ορίζω την τιμή)
Τα αλφαριθμητικά αυτά  είναι σωροί τιμών που διαχειρίζεται η Μ2000. Ο εξυπηρετητής μπορεί να βγάζει παραμέτρους από το αλφαριθμητικό, μέχρι να το τελειώσει. Η εντολή Σωρός χωρίς παραμέτρους δείχνει το σωρό, με αλφαριθμητικό το ξεφορτώνει (αν είναι έγκυρο), και με ένα δεύτερο που ορίζουμε τι θέλουμε τότε ξεφορτώνει αυτά που ζητάμε. Ξεφορτώνει από την αρχή (Αριστερά), ενώ το νήμα του αυλού το γεμίζει στο τέλος (είναι FIFO λίστα, χωρίς δείκτες, αλλά καταγράφεται το μήκος στα αλφαριθμητικά,  μόνο αριθμούς και αλφαριθμητικά παίρνει το αλφαριθμητικό σωρού)
Ανοίγουμε το m2000.exe
Γράφουμε Σ Α
Αντιγράφουμε τον "πελάτη" και τον σώνουμε με παράμετρο το όνομα τμήματος που θα τρέξει
Σώσε Τερμ1, Α
Δείτε ότι περιμένει τρεις παραμέτρους...Αυτές τις δίνει το πρόγραμμα που το καλεί ο Εξυπηρετητής.. Αδειάζουμε το σωρό και ξαναβάζουμε τις τιμές για να τις βρούμε όταν θα ξεκινήσουμε το πρόγραμμα.ξανά (μπορούμε να σταματάμε πελάτες και εξυπηρετητή, όποτε θέλουμε, και να τους ξεκινούμε ξανά).

Τα προγράμματα είναι όντως πολύπλοκα. Όμως έχουν αναφερθεί "σχεδόν όλα", Η δομή Μέρος { } Ως μεταβλητή αλλάζει την τιμή της μεταβλητής όταν τρέχει το μπλοκ. Με αυτό τον τρόπο όταν πάμε να τυπώσουμε από την ουρά εκτύπωσης βλέπουμε αν έχουμε την εισαγωγή ανοικτή και την κλείνουμε. Δεν χάνεται τίποτα, γιατί η εισαγωγή επιστρέφει το περιεχόμενο χωρίς να το σβήσει, όμως επιστρέφει στην εσωτερική μεταβλητή μόνο ανάγνωσης την αιτία, αυτή είναι η Πεδίο, και το 99 σημαίνει έξοδος με Esc πλήκτρο ή παρόμοια αιτία. Ουσιαστικά τυπώνουμε την ουρά και ξανά βλέπουμε την εισαγωγή. Απλά έχουμε την μετακίνησή της!

Το μπλοκ Επίπεδο {} χρησιμοποιείται για να δείξουμε στο νήμα ότι δεν μας ενδιαφέρει η δική του καταγραφή του αντικειμένου εξόδου, και ο δικός του δρομέας, αλλά η κοινή οθόνη. Η Μ2000 έχει 32 επίπεδα πάνω από την οθόνη, που μπορούν να χρησιμοποιηθούν ως οθόνες, με στόχους, με χωριστή ολίσθηση κ.α.


Διάβασε Αυλος$, όνομα$, κωδικός
Άδειασε
\\ κρατάμε ένα αντίγραφο! Παλιός τρόπος για στατικές!
\\ Δεν μας κάνουν οι στατικές εδώ γιατί δεν τις βλέπουν τα νήματα!
\\ (κάθε νήμα έχει τις δικές του, και το Κύριο.Έργο είναι νήμα)
Σειρά Αυλος$, όνομα$, κωδικός
Αλφα$="Τ"+γραφη$(κωδικός,"#")
Χρήση Αυλού στο Αλφα$ ως Λ
Φόρμα 40,20
Άναψε
Τίτλος "Τερματικό #"+γραφη$(κωδικός,"#")
Αναφορά 2, κεφ$(όνομα$)+" Τερματικό #"+γραφη$(κωδικός,"000")
Αναφορά "Γράψε Τέλος για τέλος!"
Οθόνη ,2 \\ χωριστή οθόνη από τη 2η γραμμή
Τυπ$=""
Αλ$={
}
\\ το νήμα που διαβάζει την επιστροφή από τον Εξυπηρετητή
Νήμα {
      Αν Αλφα$<>"" τότε {
            Εισαγωγή Τέλος
            Σωρός Νέος {
                  Σωρός Αλφα$, "ΓΓΓΑ" : Πέτα 2
                  Διάβασε Απ$, Πρωτ
                  ΟυράΕκτύπωσης(μορφη$("[{1}]:{0}", Απ$, Πρωτ))
            }
      }
} Ως Κάτι Κάθε 50
Καθαρό μόνο_εγώ
\\ Το νήμα που Τυπώνει
Νήμα {
      Αν Τυπ$<>"" τότε {
            Αν μόνο_εγώ Τότε Εισαγωγή Τέλος
            Επίπεδο {
                  Αναφορά Τυπ$
             }
            Τυπ$=""
      }
} Ως Τ Κάθε 30

α$=""           
Κύριο.Έργο 50 {
      Μέρος {
            Επίπεδο {
                  Εισαγωγή ! α$, 30 μήκος=50
            }
      } ως μόνο_εγώ
      Αν Πεδίο<>99 τότε {
             Αν αποκ$(α$)<>"" Τότε ΟυράΕκτύπωσης(Μορφή$("$ {0}", α$))
      }
      Αν α$<>"" Τότε {
            Αν Κεφ$(α$)="ΤΕΛΟΣ" Τότε Διέκοψε
            Αναλυτής
            Επανέλαβε {
                  Δες οκ {
                        \\ εδώ στέλνω στον Εξυπηρετητή
                        Αυλός Αυλος$, α$, κωδικός
                  }
            } Μέχρι οκ ή Φόρτος >5000
            Αν οκ τότε {
                  α$=""
            } Αλλιώς {
                  ΟυράΕκτύπωσης("Αποτυχία Αποστολής")
            }
      }
}
Νήματα Σβήσε
Τύπωσε "Τέλος"


Ρουτίνα ΟυράΕκτύπωσης(α$)
      α$=α$+αλ$
      Αν τυπ$<>"" τότε {
            τυπ$=τυπ$+α$
      } αλλιώς {
            τυπ$=α$
      }
Τέλος Ρουτίνας



Αφού σώσαμε τον πελάτη τώρα θα γράψουμε Νέο και θα φτιάξουμε τον Εξυπηρετητή;

Σ Α
Αντιγραφή του αρχείου παρακάτω (με τέσσερα γράμματα αρκεί)
και Σώσε Εξυπ    
Είναι πιο μικρό πρόγραμμα αλλά υποτίθεται ότι αυτό κάποια στιγμή θα διαχειρίζεται μια βάση δεδομένων (το κάνει αυτό η Μ2000 θα το δούμε σε άλλο τεύχος).
Δείτε την εντολή που ξεκινάμε το ίδιο πρόγραμμα δεύτερη φορά αλλά με άλλα στοιχεία:
      Χρήση  "Τερμ1.gsb" Αυλος$("Α12345"),"Χαζό", 102 

Αυτό τώρα θα τρέχει σε άλλο νήμα του επεξεργαστή (άλλο τα νήματα του επεξεργαστή και άλλο της Μ2000, να μην τα μπερδεύουμε). Κανονικά όμως μπορούμε τους πελάτες να τους έχουμε σε άλλους υπολογιστές και έτσι η κλήση τους από το πρόγραμμα δεν θα μπορεί να γίνει. Όμως εδώ για την ευκολία του παραδείγματος το έχουμε έτσι! Δείτε πως η επιλογή του Α12345 ως όνομα του αυλού είναι δική μας, Αυτό σημαίνει ότι μπορεί κανείς να δώσει ένα όνομα παράξενο και έτσι ουδείς να δει αν υπάρχει ή όχι αυλός, ή ποιος είναι! Οι αυλοί για να δουλέψουν σε πολλούς υπολογιστές πρέπει να υπάρχει δίκτυο με δυνατότητα κοινόχρηστων πόρων, αρχείων και εκτυπωτών.

Η εντολή Σωρός Άλφα$, "ΓΓΓΑ" αδειάζει 4 στοιχεία από την Αλφα$ στο σωρό, και η Πέτα 2 τα πετάει. Αυτά τα στοιχεία είναι ο αυλός ως όνομα και το αλφαριθμητικό με τα γράμματα που δείχνει τι στοιχεία ακολουθούν. Μπορεί εδώ να έχουμε τα Ελληνικά Γ και Α αλλά παίζει να είναι και τα αγγλικά N για Number και S για String. Το μήκος του μας λέει πόσα στοιχεία έχουμε.



Στατική Πρωτ=1
Τύπωσε "Εξυπηρετητής"
Άλφα$="Α12345"
Αν όχι κενό τότε {
      Άδειασε
      Χρήση Αυλού Στο Άλφα$ Ως Λ
      Βάλε 1
} Αλλιώς {
      Χρήση  "Τερμ1.gsb" "Χαζό", 101 Στο Άλφα$ Ως Λ
      Χρήση  "Τερμ1.gsb" Αυλος$("Α12345"),"Χαζό", 102
      Βάλε 1
}
Νήμα Λ Κάθε 200
Αρ.Πρωτ=Πρωτ
Τι$=""
Δες {
      Κύριο.Έργο 20 {
            Αν δείκτης τότε έξοδος
            Αν Αλφα$<>"" τότε {
                  Σωρός Νέος {
                        Σωρός Άλφα$, "ΓΓΓΑ"
                        Πέτα 2
                        Διάβασε Τι$, Ποιο
                        Τύπωσε "Τερματικό:", Ποιο
                        Τύπωσε "Εντολή:",Τι$,
                        Αν Τι$<>"" Τότε {
                              Αρ.Πρωτ++
                              Αναλυτής
                              Επανέλαβε {
                                    Δες οκ {
                                          Αυλός Αυλός$("Τ"+γραφη$(Ποιό,"#")), "Οκ", Αρ.Πρωτ
                                    }
                              } Μέχρι Οκ ή Φόρτος>1000
                              Τύπωσε Αρ.Πρωτ, Οκ
                        } Αλλιώς Τύπωσε
                  }
                  Αν Κεφ$(Τι$)="?" Τότε Διέκοψε
            }
      }
}
Τύπωσε "Τέλος"
ΝΗΜΑΤΑ ΣΒΗΣΕ
Πρωτ=Αρ.Πρωτ \\ σώνεται στην στατική






Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου