3. Uzak nesne haberleşmesinde kullanılan RMI
Java nın dağıtık nesneleri için destek sağlar.
RMI uzak nesneler üzerindeki metodların
çağrılmasına izin verir.
4. RMI dağıtık nesneler kullanılarak dağıtık
uygulamalar gerçekleştirmek için kullanılan
yüksek seviyeli Java API’sidir.
Uzak nesne çağrımlarında aynı Java söz
dizimini kullanabilirsiniz.
5. Java RMI modeli iki genel gereksinime sahiptir.
Birinci gereksinim RMI model basit ve
kullanımı kolay olmalı.
İkinci gereksinim ise Java dili doğal bir
şekilde kullanılmalıdır.
6. RMI’ın anahtar fikri nesneler arasında
haberleşmenin kolaylaşmasında stub ve skeletonlar
kullanır.
Stub ve skeleton otomatik üretilirken
programcıların socket seviyeli ağ programlamadaki
can sıkıntısını hafifletir.
7. RMI,
parametrelerin ağ üzerinde belirlenen formatta
gönderilmesi için
kodlanmasında (parameter marshalling)
ve bunların
geri elde edilmesinde (parameter unmarshalling)
nesne serileştirmeyi (object serialization)
kullanmaktadır.
8. İstemcilerin uzaktaki nesnelerin metotlarını RMI ile çağrılabilmeleri için,
söz konusu uzak nesnelere ilişkin referansları elde etmesi gerekmektedir.
RMI modelinde bu amaca yönelik olarak bir isim sunucu (name server)
kullanılmaktadır.
Uzak nesneler java.rmi.Naming isimli bir sınıfta bulunan metodları
kullanarak kendilerini İsim Kayıtçısı (Naming Registry) servisine
kaydettirmelidirler.
9. 1-) Remote Interface’den extends edilen
Interface
2-) Server Sınıfı
3-) Oluşturduğumuz Interface’i
implement eden sınıf
4-) Client (İstek yapacağımız) Sınıfı
10. 1-) java.rmi.Remote interfacesinden extends
edilmiş olmalı
2-) RMI tarafından gerçekleştirilecek metodlar
deklare edilmeli
3-) Her metod RemoteException fırlatmalı
12. LocateRegistry içindeki getRegistry() metodu
Parametre almayabilir
Sadece Serverın çalışacağı portu parametre alabilir
Sadece Serverın çalışacağı makinenin adresini
parametre alabilir
Serverın çalışacağı makinenin port numarasını ve
adresini (host) parametre alabilir
13. Registry içindeki metodlar
Bind() metodu ile uzak nesne ye (remote object)bir isim verilerek Registrye kayıt
edilir.
Rebind() metodu ile uzak nesneye isim verilir daha önceden uzak nesneye isim
verilmiş ise eski isim yeni isim ile değiştirilir.
Unbind() metodu uzak nesne lere verilen isimleri imha eder.
List() metodu registry de bulunan tüm nesnelerin isimlerini dizi şeklinde geri
döndürür.
Lookup() ile daha önceden bind() edilmiş uzak nesnelere isim üzerinden erişilir.
14. UnicastRemoteObject’ten extends edilmelidir.
Daha önce oluşturduğumuz interfaceden
implement edilmelidir.
Önceden oluşturduğumuz interfacedeki
metodların içleri doldurulmalıdır
(implementation).
Metodlar RemoteException fırlatmalıdır.
16. Eğer client ve server farklı makinelerde ise her iki
makinedede oluşturduğumuz interface olması gerekir.
RMI da server, client ve registry 3 farklı makinede
olabilir.
17.
18. import java.rmi.*;
public interface HesapMakinesi extends Remote {
//Tüm metodlarımızı tanımladık
public long topla(long a, long b) throws RemoteException;
public long cikar(long a, long b) throws RemoteException;
public long carp(long a, long b) throws RemoteException;
public long bol(long a, long b) throws RemoteException;
}
Hesap Makinesi İnterface
19. import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class HesapMakinesiGerceklestir
extends UnicastRemoteObject implements HesapMakinesi {
//HesapMakinesi Interfacesindeki metodlarımızın içlerini bu sınıfımda dolduruz.
private static final long serialVersionUID = 1L;
public HesapMakinesiGerceklestir() throws RemoteException {
super();
}
public long topla(long a, long b)throws RemoteException {
return a + b;
}
public long cikar(long a, long b) throws RemoteException {
return a - b;
}
public long carp(long a, long b) throws RemoteException {
return a * b;
}
public long bol(long a, long b) throws RemoteException {
return a / b;
}}
Interfacedeki Metodları Gerçekleştiren Sınıf
20. import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject; /* Client'ın kullanabileceği Remote objeler oluşturmak
için kullanılır */
public class HesapMakineSunucu {
public HesapMakineSunucu() {
try {
Registry reg=LocateRegistry.createRegistry(1099); // Burada 1099 nolu portu
RMI Registrye kayıt ettik.
reg=LocateRegistry.getRegistry(); //Burada 1099 nolu portu çalıştırıyoruz.
reg.rebind("HesapMakinesiServisi", new HesapMakinesiGerceklestir());
//İstemciden gelen servis isteğine göre
}
catch (Exception e) {
System.out.println("Hata: " + e);
}
}
public static void main(String[] args) {
new HesapMakineSunucu();} //Sunucu nesnesi oluşturuldu
}
Hesap Makinesi Sunucusu
21. import java.rmi.Naming;
public class HesapMakinesiİstemci {
public static void main(String[] args) {
try {
/* Burada sunucun IP adresini girdik sonra sunucunun açık olan 1099 nolu portunu yazdık
ve bir servis ismi tanımadık. */
HesapMakinesi h=(HesapMakinesi)Naming.lookup("rmi://127.0.0.1:1099/HesapMakinesiServisi");
/*İşlemlerin metoduna değer yolladık gelecek cevabı konsolda yazdıracağız */
System.out.println( "Çıkarma Sonucu: "+h.cikar(9, 3) );
System.out.println( "Toplama Sonucu: "+h.topla(7, 5) );
System.out.println( "Çarpma Sonucu: " +h.carp(5, 6) );
System.out.println( "Bölme Sonucu: " +h.bol(9, 3) );
}
catch (Exception e) {
System.out.println(e.getMessage());
}
} }
Hesap Makinesi İstemcisi
22.
23. import java.rmi.*;
public interface HesapMakinesi extends Remote {
//Tüm metodlarımızı tanımladık
public long topla(long a, long b) throws RemoteException;
public long cikar(long a, long b) throws RemoteException;
public long carp(long a, long b) throws RemoteException;
public long bol(long a, long b) throws RemoteException;
}
Hesap Makinesi İnterface
24. import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class HesapMakinesiGerceklestir
extends UnicastRemoteObject implements HesapMakinesi {
//HesapMakinesi Interfacesindeki metodlarımızın içlerini bu sınıfımda dolduruz.
private static final long serialVersionUID = 1L;
public HesapMakinesiGerceklestir() throws RemoteException {
super();
}
public long topla(long a, long b)throws RemoteException {
return a + b;
}
public long cikar(long a, long b) throws RemoteException {
return a - b;
}
public long carp(long a, long b) throws RemoteException {
return a * b;
}
public long bol(long a, long b) throws RemoteException {
return a / b;
}}
HesapMakinesi Interfacedeki Metodları Gerçekleştiren SInıf
25. import java.rmi.*;
public interface Calculator extends Remote {
public long square(long a) throws RemoteException;
public long power(long a, long b) throws RemoteException;
public long mod(long a, long b) throws RemoteException;
}
Calculator İnterfacesi
26. import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class CalculatorImpl
extends UnicastRemoteObject implements Calculator {
public CalculatorImpl() throws RemoteException {
super();
}
@Override
public long mod(long a, long b) throws RemoteException {
long c=a%b;
return c;
}
@Override
public long power(long a, long b) throws RemoteException {
return (long) Math.pow(a, b);
}
@Override
public long square(long a) throws RemoteException {
return (long) Math.sqrt(a);
}}
Calculator Interfacesindeki Metodlarını Gerçekleştiren Sınıf
27. import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject; /* Client'ın kullanabileceği Remote objectler oluşturmak
için kullanılır */
public class HesapMakineSunucu {
public HesapMakineSunucu() {
try {
// Burada 1099 nolu portu RMI Registrye kayıt ettik.
Registry reg=LocateRegistry.createRegistry(1099);
reg=LocateRegistry.getRegistry(); //Burada 1099 nolu portu çalıştırıyoruz.
reg.rebind("HesapMakinesiServisi", new HesapMakinesiGerceklestir());
reg.rebind("BilimselHesapServisi", new CalculatorImpl());
//İstemciden gelen servis isteğine göre
}
catch (Exception e) {
System.out.println("Hata: " + e);
}
}
public static void main(String[] args) {
new HesapMakineSunucu();} //Sunucu nesnesi oluşturuldu
}
Hesap Makinesi Sunucusu
28. import java.rmi.Naming;
public class HesapMakinesiİstemci {
public static void main(String[] args) {
try {
/* Burada sunucun IP adresini girdik sonra sunucunun açık olan 1099 nolu portunu yazdık
ve bir servis ismi tanımadık. */
HesapMakinesi h=(HesapMakinesi)Naming.lookup("rmi://127.0.0.1:1099/HesapMakinesiServisi");
/*İşlemlerin metoduna değer yolladık gelecek cevabı konsolda yazdıracağız */
System.out.println( "Çıkarma Sonucu: "+h.cikar(9, 3) );
System.out.println( "Toplama Sonucu: "+h.topla(7, 5) );
System.out.println( "Çarpma Sonucu: " +h.carp(5, 6) );
System.out.println( "Bölme Sonucu: " +h.bol(9, 3) );
System.out.println( "Mod Alma Sonucu: "+c.mod(7, 5) );
System.out.println( "Üs Alma Sonucu: " +c.power(5, 6) );
System.out.println( "Karekök Sonucu: " +c.square(9) );
}
catch (Exception e) {
System.out.println(e.getMessage());
}
} }
Hesap Makinesi İstemcisi
29. Konsol Görüntüsü
Çıkarma Sonucu: 6
Toplama Sonucu: 12
Çarpma Sonucu: 30
Bölme Sonucu: 3
Mod Alma Sonucu: 2
Üs Alma Sonucu: 15625
Karekök Sonucu: 3