Όλα για το μητρώο Java RMI και πώς να το χρησιμοποιήσετε

Όλα για το μητρώο Java RMI και πώς να το χρησιμοποιήσετε

RMI σημαίνει κλήση απομακρυσμένης μεθόδου και, όπως υποδηλώνει το όνομα, είναι ένα πρωτόκολλο για ένα πρόγραμμα Java για την επίκληση μιας μεθόδου ενός αντικειμένου που εκτελείται σε άλλο υπολογιστή. Παρέχει ένα API (Application Programming Interface) για την εξαγωγή ενός αντικειμένου από ένα πρόγραμμα (που ονομάζεται διακομιστής) και την επίκληση των μεθόδων αυτού του αντικειμένου από ένα άλλο πρόγραμμα (που ονομάζεται client), πιθανόν να εκτελείται σε διαφορετικό υπολογιστή.





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





πώς να δείτε ποιος σας απέκλεισε στο instagram

Δήλωση διεπαφής διακομιστή

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





import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Greeting extends Remote
{
public String greet(String name) throws RemoteException;
}

Το όνομα της διεπαφής καλείται Χαιρετισμός Το Παρέχει μια ενιαία μέθοδο που ονομάζεται χαιρετώ() που δέχεται ένα όνομα και επιστρέφει έναν κατάλληλο χαιρετισμό.

Για να επισημάνετε αυτήν τη διεπαφή ως εξαγώγιμη, πρέπει να επεκτείνετε την java.rmi.Remote διεπαφή. Επίσης η μέθοδος πρέπει να δηλώσει α ρίχνει καταχώριση ρήτρας java.rmi.RemoteException εκτός από τυχόν εξαιρέσεις συγκεκριμένων εφαρμογών. Αυτό συμβαίνει έτσι ώστε ο κωδικός πελάτη να μπορεί να χειριστεί (ή να διαδώσει) σφάλματα επίκλησης απομακρυσμένης μεθόδου, όπως π.χ. host-not-found , σύνδεση-βλάβη , και τα λοιπά.



Υλοποίηση του αντικειμένου διακομιστή

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

public class GreetingObject implements Greeting
{
private String fmtString = 'Hello, %s';
public String greet(String name)
{
return String.format(this.fmtString, name);
}
}

Κύρια μέθοδος διακομιστή

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





  • Το πρώτο βήμα είναι να δημιουργήσετε την εφαρμογή αντικειμένου διακομιστή. | _+_ |
  • Στη συνέχεια, λαμβάνουμε ένα στέλεχος για το αντικείμενο διακομιστή από το χρόνο εκτέλεσης RMI. Το στέλεχος υλοποιεί την ίδια διεπαφή με το αντικείμενο διακομιστή. Ωστόσο, η μέθοδος υλοποιεί την απαιτούμενη επικοινωνία με το αντικείμενο του απομακρυσμένου διακομιστή. Αυτό το στέλεχος χρησιμοποιείται από τον πελάτη για διαφανή επίκληση της μεθόδου στο αντικείμενο διακομιστή. | _+_ |
  • Μόλις αποκτηθεί το στέλεχος, παραδίδουμε αυτό το στέλεχος στο μητρώο RMI για να συνδεθεί σε μια καθορισμένη υπηρεσία με όνομα. Όταν ο πελάτης ζητά την εφαρμογή αυτής της υπηρεσίας, λαμβάνει το στέλεχος που ξέρει πώς να επικοινωνεί με το αντικείμενο διακομιστή. Στη συνέχεια, η στατική μέθοδος LocateRegistry.getRegistry () χρησιμοποιείται για τη λήψη της αναφοράς τοπικού μητρώου. ο rebind () η μέθοδος χρησιμοποιείται στη συνέχεια για να δεσμεύσει το όνομα στο στέλεχος. | _+_ |

Η πλήρης κύρια μέθοδος.

Greeting greeting = new GreetingObject();

Δημιουργία διακομιστή

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





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

Greeting stub = (Greeting)UnicastRemoteObject.exportObject(greeting, 0);

Συλλέξτε τα αρχεία της τάξης σε ένα αρχείο JAR για εκτέλεση.

String name = 'Greeting';
Registry registry = LocateRegistry.getRegistry(port);
registry.rebind(name, stub);

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

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
public class Main
{
static public void main(String[] args) throws Exception
{
if ( args.length == 0 ) {
System.err.println('usage: java Main port#');
System.exit(1);
}
int index = 0;
int port = Integer.parseInt(args[index++]);
String name = 'Greeting';
Greeting greeting = new GreetingObject();
Greeting stub = (Greeting)UnicastRemoteObject.exportObject(greeting, 0);
Registry registry = LocateRegistry.getRegistry(port);
registry.rebind(name, stub);
System.out.println('Greeting bound to '' + name + ''');
}
}

Υλοποίηση του Πελάτη

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

  • Όπως και με τον διακομιστή, λάβετε μια αναφορά στο μητρώο, καθορίζοντας το όνομα κεντρικού υπολογιστή όπου εκτελείται το μητρώο και τον αριθμό θύρας. | _+_ |
  • Στη συνέχεια, αναζητήστε την υπηρεσία στο μητρώο. ο ψάχνω() η μέθοδος επιστρέφει ένα στέλεχος που μπορεί να χρησιμοποιηθεί για την επίκληση υπηρεσιών. | _+_ |
  • Και επικαλεστείτε τη μέθοδο περνώντας τα απαιτούμενα ορίσματα. Εδώ, παίρνουμε τον χαιρετισμό περνώντας το όνομα και εκτυπώνοντάς το. | _+_ |

Ο πλήρης κωδικός πελάτη:

rm -rf target
mkdir target
javac -d target src/server/*.java

Το μητρώο RMI

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

jar cvf target/rmi-server.jar -C target server

Τι είναι αυτή η εξαίρεση ; Η σύνδεση αρνήθηκε Το

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

Η λύση είναι να εκτελέσετε το μητρώο RMI. Το μητρώο RMI είναι ένα πρόγραμμα που αποστέλλεται με την εικονική μηχανή Java και ονομάζεται rmiregistry Το Θα πρέπει να βρίσκεται στο είμαι κατάλογο της εγκατάστασης εικονικής μηχανής Java. Η εκτέλεσή του είναι τόσο απλή όσο:

jar cvf target/rmi-lib.jar -C target server/Greeting.class

Από προεπιλογή, το μητρώο ακούει στη θύρα 1099. Για να το ακούσετε σε άλλη θύρα, καθορίστε τον αριθμό θύρας ως εξής:

Registry registry = LocateRegistry.getRegistry(host, port);

Βεβαιωθείτε ότι υπάρχει πράγματι ένας ακροατής στην καθορισμένη θύρα με η εντολή netstat :

πώς να ηχογραφήσετε μουσική με θράσος
Greeting greeting = (Greeting) registry.lookup(name);

Εκτέλεση του διακομιστή

Ας προσπαθήσουμε τώρα να τρέξουμε ξανά τον διακομιστή.

System.out.println(name + ' reported: ' + greeting.greet(myName));

Και πάλι εξαίρεση! Τι είναι αυτή τη φορά;

Ο διακομιστής δεν μπορεί να φορτώσει την κλάση διεπαφής διακομιστή. Χαιρετισμός Το Αυτό συμβαίνει επειδή το μητρώο RMI δεν είναι σε θέση να φορτώσει την απαιτούμενη κλάση. Επομένως, πρέπει να καθορίσετε τη θέση των απαιτούμενων τάξεων. Ένας τρόπος για να το κάνετε είναι να καθορίσετε τη μεταβλητή περιβάλλοντος CLASSPATH:

package client;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import server.Greeting;
public class Client
{
static public void main(String[] args) throws Exception
{
if ( args.length != 3 ) {
System.err.println('usage: java Client host port myName');
System.exit(1);
}
int index = 0;
String host = args[index++];
int port = Integer.parseInt(args[index++]);
String myName = args[index++];
String name = 'Greeting';
Registry registry = LocateRegistry.getRegistry(host, port);
Greeting greeting = (Greeting) registry.lookup(name);
System.out.println(name + ' reported: ' + greeting.greet(myName));
}
}

Η προσπάθεια εκ νέου εκτέλεση του διακομιστή δίνει:

java -cp target/rmi-server.jar server.Main 1099
# throws
Exception in thread 'main' java.rmi.ConnectException: Connection refused to host: xxx; nested exception is:
java.net.ConnectException: Connection refused

Τώρα ο διακομιστής λειτουργεί.

Εκτέλεση του Πελάτη

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

/usr/lib/jvm/jdk1.8.0_71/bin/rmiregistry

Περίληψη

Το Java RMI παρέχει API και εργαλεία για ευκολότερη εκτέλεση απομακρυσμένου κώδικα. Μπορείτε να υλοποιήσετε έναν διακομιστή που καταχωρεί ένα αντικείμενο υπηρεσίας στο μητρώο Java RMI. Οι πελάτες μπορούν να αναζητήσουν το μητρώο και να αποκτήσουν στέλεχος αντικειμένου υπηρεσίας για την επίκληση των μεθόδων υπηρεσίας. Όπως δείχνει αυτό το παράδειγμα, όλα είναι αρκετά απλά.

Χρησιμοποιείτε Java RMI στο έργο σας; Ποια ήταν η εμπειρία σας; Υπάρχουν εναλλακτικές που έχετε ερευνήσει; Ενημερώστε μας στα παρακάτω σχόλια.

Μερίδιο Μερίδιο Τιτίβισμα ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ Ένας αρχάριος οδηγός για την εμψύχωση του λόγου

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

Διαβάστε Επόμενο
Σχετικά θέματα
  • Προγραμματισμός
  • Ιάβα
Σχετικά με τον Συγγραφέα Jay Sridhar(Δημοσιεύθηκαν 17 άρθρα) Περισσότερα από τον Jay Sridhar

Εγγραφείτε στο newsletter μας

Εγγραφείτε στο ενημερωτικό μας δελτίο για τεχνικές συμβουλές, κριτικές, δωρεάν ebooks και αποκλειστικές προσφορές!

Κάντε κλικ εδώ για εγγραφή