Java RMI Kayıt Defteri ve Nasıl Kullanılacağı Hakkında Her Şey

Java RMI Kayıt Defteri ve Nasıl Kullanılacağı Hakkında Her Şey

RMI anlamına gelir uzak yöntem çağırma ve adından da anlaşılacağı gibi, bir Java programının başka bir bilgisayarda çalışan bir nesnenin yöntemini çağırması için bir protokoldür. Bir programdan (sunucu olarak adlandırılır) bir nesneyi dışa aktarmak ve muhtemelen farklı bir bilgisayarda çalışan başka bir programdan (istemci olarak adlandırılır) bu nesnenin yöntemlerini çağırmak için bir API (Uygulama Programlama Arayüzü) sağlar.





Java RMI Kaydı Java RMI sisteminin önemli bir bileşenidir ve sunucuların hizmetleri kaydetmesi ve istemcilerin bu hizmetleri araması için merkezi bir dizin sağlar. Bu makalede, bir nesneyi ortaya çıkarmak için bir sunucunun nasıl uygulanacağını ve sunucuda bir yöntemi çağırmak için bir istemcinin nasıl uygulanacağını ve ayrıca RMI Registry'de hizmetin kaydedilmesini ve aranmasını öğreneceğiz.





aygıt tanımlayıcı isteği başarısız oldu Windows 10

Sunucu Arayüzünü Bildirme

Java RMI sisteminin nasıl çalıştığının inceliklerini öğrenmek için, bir adı kabul etmek ve bir selamlama göndermek için bir yöntem sağlayan basit bir sunucu nesnesi uygulayalım. İşte nesne arayüzünün tanımı:





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

Arayüzün adı denir Selamlama . adlı tek bir yöntem sağlar. selamlaşmak() hangi bir isim kabul eder ve uygun bir selamlama döndürür.

Bu arayüzü dışa aktarılabilir olarak işaretlemek için, java.rmi.Uzaktan kumanda arayüz. Ayrıca yöntemin bir beyan etmesi gerekiyor atar madde listesi java.rmi.RemoteException herhangi bir uygulamaya özel istisnalara ek olarak. Bu, istemci kodunun aşağıdakiler gibi uzak yöntem çağırma hatalarını işleyebilmesi (veya yayabilmesi) içindir. ana bilgisayar bulunamadı , bağlantı hatası , vesaire.



Sunucu Nesnesini Uygulamak

İstemciler tarafından kullanılan arabirimi bildirdikten sonra, sunucu tarafı nesnesini uygularız ve aşağıdakileri sağlarız: selamlaşmak() gösterildiği gibi bir yöntem. Selamlamayı biçimlendirmek için basit bir biçim dizesi kullanır.

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

Sunucu Ana Yöntemi

Şimdi tüm bu parçaları bir araya getirelim ve ana() sunucu yöntemi. İlgili adımların her birini inceleyelim.





  • İlk adım, sunucu nesnesi uygulamasını oluşturmaktır. |_+_|
  • Ardından, RMI çalışma zamanından sunucu nesnesi için bir saplama elde ederiz. Saplama, sunucu nesnesiyle aynı arabirimi uygular. Ancak yöntem, uzak sunucu nesnesi ile gerekli iletişimi uygular. Bu saplama, istemci tarafından sunucu nesnesindeki yöntemi şeffaf bir şekilde çağırmak için kullanılır. |_+_|
  • Saplama elde edildikten sonra, belirtilen adlandırılmış hizmete bağlanmak için bu saplamayı RMI kayıt defterine teslim ederiz. İstemci bu hizmetin bir uygulamasını istediğinde, sunucu nesnesi ile nasıl iletişim kuracağını bilen saplamayı alır. Aşağıda statik yöntem LocateRegistry.getRegistry() yerel kayıt defteri referansını almak için kullanılır. NS yeniden bağla() yöntemi daha sonra adı saplamaya bağlamak için kullanılır. |_+_|

Tam ana yöntem.

Greeting greeting = new GreetingObject();

Sunucuyu Kurmak

Şimdi sunucuyu oluşturmaya bakalım. İşleri basit tutmak için, Maven gibi bir inşa aracı kullanmak yerine Linux'ta komut satırını kullanarak inşa ediyoruz.





Aşağıdaki, kaynak dosyaları bir hedef dizindeki dosyaları sınıflandırmak için derler.

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

Yürütme için sınıf dosyalarını bir JAR dosyasında toplayın.

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

İstemciyi bir JAR kitaplığında derlemek için gereken arayüz dosyalarını da topluyoruz.

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

İstemciyi Uygulamak

Şimdi sunucu nesnesi yöntemlerini çağırmak için kullanılan istemciyi uygulamaya bakalım.

  • Sunucuda olduğu gibi, kayıt defterinin çalıştığı ana bilgisayar adını ve bağlantı noktası numarasını belirterek kayıt defterine bir başvuru alın. |_+_|
  • Ardından, hizmeti kayıt defterinde arayın. NS bakmak() yöntem, hizmetleri çağırmak için kullanılabilecek bir saplama döndürür. |_+_|
  • Ve gerekli argümanları ileten yöntemi çağırın. Burada adı geçip yazdırarak selamlamayı alıyoruz. |_+_|

Komple Müşteri Kodu:

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

RMI Kaydı

Şimdi sunucu programını çalıştıralım, böylece istekleri sunmaya başlayabilir.

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

Nedir bu istisna ? Bağlantı reddedildi .

Bu istisnayı almanızın nedeni şudur: sunucu kodundan, 1099 numaralı bağlantı noktasında yerel kayıt defterine bağlanmaya çalıştığını not edin. Bu başarısız olursa, bu istisna ile karşılaşırsınız.

Çözüm, RMI Kayıt Defterini çalıştırmaktır. RMI Kayıt Defteri, Java Sanal Makinesi ile birlikte gönderilen bir programdır ve rmiregistry . içinde yer almalıdır. NS Java Sanal Makinesi kurulumunun dizini. Çalıştırmak şu kadar basittir:

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

Kayıt defteri varsayılan olarak 1099 numaralı bağlantı noktasını dinler. Başka bir bağlantı noktasında dinlemesini sağlamak için bağlantı noktası numarasını aşağıdaki gibi belirtin:

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

Belirtilen bağlantı noktasında gerçekten bir dinleyici olup olmadığını kontrol edin. netstat komutu :

Windows 10 için en iyi fotoğraf görüntüleme uygulaması
Greeting greeting = (Greeting) registry.lookup(name);

Sunucuyu Çalıştırmak

Şimdi sunucuyu tekrar çalıştırmayı deneyelim.

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

Yine bir istisna! Bu sefer ne var?

Sunucu, arayüz sınıfını yükleyemiyor sunucu.Tebrik . Bunun nedeni, RMI Kayıt Defteri'nin gerekli sınıfı yükleyememesidir. Bu yüzden gerekli sınıfların yerini belirtmeniz gerekiyor. Bunu yapmanın bir yolu, CLASSPATH ortam değişkenini belirtmektir:

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

Sunucuyu tekrar çalıştırmaya çalışmak şunları verir:

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

Şimdi sunucu çalışıyor.

İstemciyi Çalıştırma

Tüm parçalar birleştirilip çalıştırıldıktan sonra istemciyi çalıştırmak basittir. Yürütme için uygun JAR'lara ihtiyacı var. Bunlar, aşağıdakileri içeren sınıfı içerir: ana() yöntem ve arayüz sınıfı. RMI kayıt defterinin nerede çalıştığını gösteren bağımsız değişkenleri ve karşılama için bir ad kabul eder.

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

Özet

Java RMI, uzaktan kod yürütmeyi kolaylaştırmak için bir API ve araçlar sağlar. Java RMI Registry ile bir hizmet nesnesini kaydeden bir sunucu uygulayabilirsiniz. İstemciler, hizmet yöntemlerini çağırmak için kayıt defterini sorgulayabilir ve hizmet nesnesi saplaması alabilir. Bu örneğin gösterdiği gibi, hepsi oldukça basittir.

Projenizde Java RMI kullanıyor musunuz? Deneyimin ne oldu? Araştırdığınız alternatifler var mı? Lütfen aşağıdaki yorumlarda bize bildirin.

Paylaş Paylaş Cıvıldamak E-posta Konuşmayı Canlandırmak İçin Yeni Başlayanlar Kılavuzu

Konuşmayı canlandırmak zor olabilir. Projenize diyalog eklemeye hazırsanız, süreci sizin için özetleyeceğiz.

Sonrakini Oku
İlgili konular
  • Programlama
  • Java
Yazar hakkında Jay Sridhar(17 Makale Yayınlandı) Jay Sridhar'dan Daha Fazla

Haber bültenimize abone ol

Teknik ipuçları, incelemeler, ücretsiz e-kitaplar ve özel fırsatlar için bültenimize katılın!

Abone olmak için buraya tıklayın