הכל אודות רישום Java RMI וכיצד להשתמש בו

הכל אודות רישום Java RMI וכיצד להשתמש בו

RMI מייצג הפעלת שיטה מרחוק וכפי שהשם מציין, הוא פרוטוקול לתוכנת Java להפעיל שיטה של ​​אובייקט הפועל במחשב אחר. הוא מספק ממשק API (ממשק תכנות יישומים) לייצוא אובייקט מתוכנית אחת (שנקראת השרת) והפעלת שיטות של אובייקט זה מתוכנית אחרת (הנקראת לקוח), ואולי פועל במחשב אחר.





הג'אווה רישום RMI הוא מרכיב מרכזי במערכת Java RMI ומספק ספרייה מרכזית לשרתים לרישום שירותים וללקוחות לחפש שירותים אלה. במאמר זה, אנו לומדים כיצד ליישם שרת לחשיפת אובייקט ולקוח להפעלת שיטה בשרת, כמו גם רישום וחיפוש השירות במרשם RMI.





חלונות 10 כבה הודעות דואר

הצהרת ממשק השרת

כדי ללמוד את המורכבות של אופן פעולת מערכת ה- RMI של Java, הרשה לנו ליישם אובייקט שרת פשוט המספק שיטה לקבלת שם והחזרת ברכה. להלן ההגדרה של ממשק האובייקט:





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 בנוסף לכל חריגים ספציפיים לאפליקציה. זאת על מנת שקוד הלקוח יוכל להתמודד (או להפיץ) שגיאות קריאה לשיטות מרוחקות כגון לא נמצא שרת מארח , כשל בחיבור , וכו.



יישום אובייקט השרת

לאחר הכרזת הממשק (המשמש את הלקוחות), אנו מיישמים את האובייקט בצד השרת, ומספקים את לברך() שיטה כפי שמוצג. הוא משתמש במחרוזת פורמט פשוטה לעיצוב הברכה.

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 () משמש להשגת הפניה לרישום המקומי. ה לסובב מחדש () לאחר מכן משתמשים בשיטה כדי לאגד את השם לגמילה. | _+_ |

השיטה העיקרית המלאה.

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 ונקראת רמירגיה . זה צריך להיות ממוקם ב אני ספריית התקנת Java Virtual Machine. הפעלתו פשוטה כמו:

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

עכשיו השרת פועל.

הפעלת הלקוח

לאחר שכל החלקים מורכבים ומבצעים, הפעלת הלקוח פשוטה. הוא צריך את ה- JAR המתאימים לביצוע. אלה כוללים את הכיתה המכילה את רָאשִׁי() השיטה ומחלקת הממשק. הוא מקבל ארגומנטים המציינים היכן פועל רישום RMI, ושם לברכה.

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

סיכום

Java RMI מספק API וכלים להקלת ביצוע קוד מרחוק. באפשרותך ליישם שרת אשר רושם אובייקט שירות ברשום Java RMI. לקוחות יכולים לשאול את הרישום ולקבל את הבסיס של אובייקט שירות לצורך הפעלת שיטות השירות. כפי שמדגימה דוגמה זו, הכל די פשוט.

האם אתה משתמש ב- Java RMI בפרויקט שלך? מה הייתה הניסיון שלך? האם יש חלופות שבדקת? אנא יידע אותנו בתגובות למטה.

לַחֲלוֹק לַחֲלוֹק צִיוּץ אימייל מדריך למתחילים בדיבור אנימציה

הנפשת דיבור יכולה להיות אתגר. אם אתה מוכן להתחיל להוסיף דיאלוג לפרויקט שלך, נשבור עבורך את התהליך.

קרא הבא
נושאים קשורים
  • תִכנוּת
  • ג'אווה
על הסופר ג'יי סרידהאר(פורסמו 17 מאמרים) עוד מג'יי סרידהאר

הירשם לניוזלטר שלנו

הצטרף לניוזלטר שלנו לקבלת טיפים, סקירות, ספרים אלקטרוניים בחינם ומבצעים בלעדיים!

לחצו כאן להרשמה