كل شيء عن سجل Java RMI وكيفية استخدامه

كل شيء عن سجل Java RMI وكيفية استخدامه

جمهورية جزر مارشال تمثل دعاء الأسلوب البعيد وكما يشير الاسم ، هو بروتوكول لبرنامج Java لاستدعاء طريقة كائن يعمل على كمبيوتر آخر. يوفر API (واجهة برمجة التطبيقات) لتصدير كائن من برنامج واحد (يسمى الخادم) واستدعاء أساليب هذا الكائن من برنامج آخر (يسمى العميل) ، ربما يعمل على جهاز كمبيوتر مختلف.





جافا سجل RMI هو مكون رئيسي لنظام Java RMI ويوفر دليلًا مركزيًا للخوادم لتسجيل الخدمات وللعملاء للبحث عن هذه الخدمات. في هذه المقالة ، نتعلم كيفية تنفيذ خادم لكشف كائن وعميل لاستدعاء طريقة على الخادم ، وكذلك التسجيل والبحث عن الخدمة في سجل RMI.





ما هو أفضل تطبيق أفلام مجاني

إعلان واجهة الخادم

لتعلم تعقيدات كيفية عمل نظام 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 بالإضافة إلى أي استثناءات خاصة بالتطبيق. هذا حتى يمكن لرمز العميل معالجة (أو نشر) أخطاء استدعاء الطريقة البعيدة مثل المضيف غير موجود و فشل الاتصال ، إلخ.



تنفيذ كائن الخادم

بعد التصريح عن الواجهة (التي يستخدمها العملاء) ، نقوم بتنفيذ كائن جانب الخادم ، ونوفر الامتداد تحية () الطريقة كما هو موضح. يستخدم سلسلة تنسيق بسيطة لتنسيق التحية.

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

الطريقة الرئيسية للخادم

دعونا الآن نجمع كل هذه القطع معًا وننفذ ملف الأساسية() طريقة الخادم. دعونا نستعرض كل خطوة من الخطوات ذات الصلة.





  • الخطوة الأولى هي إنشاء تطبيق كائن الخادم. Greeting greeting = new GreetingObject();
  • بعد ذلك ، نحصل على كعب لكائن الخادم من وقت تشغيل RMI. يقوم كعب الروتين بتنفيذ نفس الواجهة ككائن الخادم. ومع ذلك ، تقوم الطريقة بتنفيذ الاتصال المطلوب مع كائن الخادم البعيد. يتم استخدام كعب الروتين هذا من قبل العميل لاستدعاء الطريقة بشفافية على كائن الخادم. Greeting stub = (Greeting)UnicastRemoteObject.exportObject(greeting, 0);
  • بمجرد الحصول على كعب الروتين ، نقوم بتسليم هذا كعب الروتين إلى سجل RMI للربط بخدمة محددة مسماة. عندما يطلب العميل تنفيذ هذه الخدمة ، فإنه يتلقى كعب الروتين الذي يعرف كيفية الاتصال بكائن الخادم ، وفي ما يلي الطريقة الثابتة LocateRegistry.getRegistry () يستخدم للحصول على مرجع التسجيل المحلي. ال rebind () ثم يتم استخدام الطريقة لربط الاسم بالعقب. String name = 'Greeting';
    Registry registry = LocateRegistry.getRegistry(port);
    registry.rebind(name, stub);

الطريقة الرئيسية الكاملة.

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 + ''');
}
}

بناء الخادم

دعونا ننظر الآن في بناء الخادم. لإبقاء الأمور بسيطة ، نبني باستخدام سطر الأوامر على Linux بدلاً من استخدام أداة بناء مثل Maven.





يقوم التالي بترجمة الملفات المصدر إلى فئة الملفات في الدليل الهدف.

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

اجمع ملفات الفصل في ملف JAR للتنفيذ.

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

نقوم أيضًا بتجميع ملفات الواجهة المطلوبة لتجميع العميل في مكتبة JAR.

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

تنفيذ العميل

دعونا الآن ننظر في تطبيق العميل المستخدم لاستدعاء أساليب كائن الخادم.

  • كما هو الحال مع الخادم ، احصل على مرجع إلى السجل ، مع تحديد اسم المضيف حيث يتم تشغيل السجل ، ورقم المنفذ. Registry registry = LocateRegistry.getRegistry(host, port);
  • بعد ذلك ، ابحث عن الخدمة في التسجيل. ال ابحث عن() تُرجع الطريقة كعبًا يمكن استخدامه لاستدعاء الخدمات. Greeting greeting = (Greeting) registry.lookup(name);
  • واستدعاء طريقة تمرير المعطيات المطلوبة. هنا نحصل على التحية بتمرير الاسم وطباعته. System.out.println(name + ' reported: ' + greeting.greet(myName));

كود العميل الكامل:

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));
}
}

سجل RMI

لنقم الآن بتشغيل برنامج الخادم حتى يتمكن من بدء خدمة الطلبات.

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

ما هو هذا الاستثناء ؟ رفض اتصال .

سبب حصولك على هذا الاستثناء هو: لاحظ من رمز الخادم أنه يحاول الاتصال بالتسجيل المحلي على المنفذ 1099. إذا فشل ذلك ، ينتهي بك الأمر مع هذا الاستثناء.

الحل هو تشغيل RMI Registry. RMI Registry هو برنامج يتم شحنه مع Java Virtual Machine ويسمى rmiregistry . يجب أن يكون موجودا في صباحا دليل تثبيت Java Virtual Machine. تشغيله بسيط مثل:

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

بشكل افتراضي ، يستمع السجل إلى المنفذ 1099. لجعله يستمع على منفذ آخر ، حدد رقم المنفذ كما يلي:

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

تحقق من وجود مستمع بالفعل في المنفذ المحدد باستخدام الأمر netstat :

قام شخص ما بحظرني على Facebook ولكن يمكنني رؤية صورته
netstat -an -t tcp -p | grep LISTEN
...
tcp6 0 0 :::1100 :::* LISTEN 23450/rmiregistry

تشغيل الخادم

دعونا الآن نحاول تشغيل الخادم مرة أخرى.

java -cp target/rmi-server.jar server.Main 1100
# throws
java.rmi.UnmarshalException: error unmarshalling arguments
...
Caused by: java.lang.ClassNotFoundException: server.Greeting
...

استثناء مرة أخرى! ما هو هذا الوقت؟

الخادم غير قادر على تحميل فئة الواجهة الخادم . يحدث هذا لأن RMI Registry غير قادر على تحميل الفئة المطلوبة. لذلك تحتاج إلى تحديد موقع الفئات المطلوبة. تتمثل إحدى طرق القيام بذلك في تحديد متغير بيئة CLASSPATH:

CLASSPATH=../../junk/target/rmi-lib.jar /usr/lib/jvm/jdk1.8.0_71/bin/rmiregistry 1100

محاولة تشغيل الخادم مرة أخرى يعطي:

java -cp target/rmi-server.jar server.Main 1100
# prints
Greeting bound to 'Greeting'

الآن الخادم قيد التشغيل.

تشغيل العميل

بعد تجميع جميع الأجزاء وتنفيذها ، يكون تشغيل العميل أمرًا بسيطًا. يحتاج إلى JARs المناسبة للتنفيذ. وتشمل هذه الفئة التي تحتوي على الأساسية() الطريقة ، وفئة الواجهة. يقبل الوسيطات التي تشير إلى مكان تشغيل سجل RMI ، واسم الترحيب.

java -cp target/rmi-client.jar:target/rmi-lib.jar client.Client localhost 1100 Peter
# prints
Greeting reported: Hello, Peter

ملخص

توفر Java RMI واجهة برمجة تطبيقات وأدوات لتسهيل تنفيذ التعليمات البرمجية عن بُعد. يمكنك تنفيذ خادم يقوم بتسجيل كائن خدمة باستخدام Java RMI Registry. يمكن للعملاء الاستعلام عن التسجيل والحصول على كعب روتين لكائن الخدمة لاستدعاء أساليب الخدمة. كما يوضح هذا المثال ، كل شيء بسيط للغاية.

هل تستخدم Java RMI في مشروعك؟ ما كانت تجربتك؟ هل هناك أي بدائل بحثت عنها؟ واسمحوا لنا أن نعرف في التعليقات أدناه.

يشارك يشارك سقسقة بريد الالكتروني دليل المبتدئين لتحريك الكلام

يمكن أن يمثل تنشيط الكلام تحديًا. إذا كنت مستعدًا لبدء إضافة حوار إلى مشروعك ، فسنقوم بتفصيل العملية نيابةً عنك.

اقرأ التالي
مواضيع ذات صلة
  • برمجة
  • جافا
نبذة عن الكاتب جاي سريدهار(تم نشر 17 مقالة) المزيد من Jay Sridhar

اشترك في نشرتنا الإخبارية

انضم إلى النشرة الإخبارية لدينا للحصول على نصائح تقنية ومراجعات وكتب إلكترونية مجانية وصفقات حصرية!

انقر هنا للاشتراك