Emrah KAHRAMAN - Java RMI

3,952 views

Published on

Published in: Technology, News & Politics
  • Be the first to comment

Emrah KAHRAMAN - Java RMI

  1. 1. Emrah KAHRAMAN Software Development Specialist
  2. 2. Remote Method Invocation Uzak Metod Çağırma
  3. 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. 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. 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. 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. 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. 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. 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. 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ı
  11. 11. Registry reg= LocateRegistry.getRegistry(); reg.rebind("StudentServerInterfaceImpl", new StudentServerInterfaceImpl(); Aşağıdaki gibi önce Registry’i referans alan bir nesne tanımlanmalı
  12. 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. 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. 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.
  15. 15. HesapMakinesi h=null; h=(HesapMakinesi)Naming.lookup("rmi://127.0.0.1:1099/HesapMakinesiServisi"); h.cikar(9, 3) ; Oluşturduğumuz Interfaceden referans elde ederek lookup metodu ile servera host , port bilgilerini ve uzak nesneye verdiğimiz isim ile bağlanırız.Sonra elimizdeki uzak nesne ile server üzerindeki metodlara erişebiliriz.
  16. 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. 17. 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
  18. 18. 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
  19. 19. 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
  20. 20. 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
  21. 21. 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
  22. 22. 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
  23. 23. 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
  24. 24. 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
  25. 25. 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
  26. 26. 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
  27. 27. 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
  28. 28. import java.rmi.Remote; import java.rmi.RemoteException; import java.util.Vector; public interface Msn extends Remote { public void mesajKaydet(String ad, String str) throws RemoteException; public Vector mesajAl() throws RemoteException; }
  29. 29. import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; import java.util.Vector; public class MsnImpl extends UnicastRemoteObject implements Msn { private static final long serialVersionUID = 1L; Vector x=new Vector(); protected MsnImpl() throws RemoteException { super(); }
  30. 30. public void mesajKaydet(String ad, String msg) { x.addElement(ad + " : "+msg); } public Vector mesajAl() { return x; } }
  31. 31. import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; public class MsnServer { public MsnServer() { try { Registry reg=LocateRegistry.createRegistry(1099); reg=LocateRegistry.getRegistry(); reg.rebind("MsnService", new MsnImpl()); } catch (Exception e) { System.out.println("Trouble: " + e); } }
  32. 32. public static void main(String[] args) { new MsnServer(); } }
  33. 33. import javax.swing.SwingUtilities; import javax.swing.JPanel; import javax.swing.JFrame; import java.awt.Rectangle; import java.rmi.Naming; import java.rmi.RemoteException; import javax.swing.JTextField; import javax.swing.JLabel; import javax.swing.JButton; import javax.swing.JList;
  34. 34. public class MsnClient extends JFrame implements Runnable { private static final long serialVersionUID = 1L; private JPanel jContentPane = null; private JTextField txt01 = null; private JLabel lbl01 = null; private JLabel lbl02 = null; private JButton btn = null; private JList list = null; private Msn msn;
  35. 35. private JTextField getTxt01() { if (txt01 == null) { txt01 = new JTextField(); txt01.setBounds(new Rectangle(205, 253, 353, 91)); txt01.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { String ad="EMRAH"; String str=txt01.getText(); try { msn.mesajKaydet(ad,str); } catch (RemoteException re) { System.err.println("RMI mesaj kaydetme hatasi: " + re.getMessage()); } txt01.setText(""); } }); } return txt01; }
  36. 36. private JButton getBtn() { if (btn == null) { btn = new JButton(); btn.setBounds(new Rectangle(565, 254, 82, 89)); btn.setText("Gönder"); btn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { String ad="EMRAH"; String str=txt01.getText(); try { msn.mesajKaydet(ad,str); } catch (RemoteException re) { System.err.println("RMI mesaj kaydetme hatasi: " + re.getMessage()); } txt01.setText(""); } }); } return btn; }
  37. 37. private JList getList() { if (list == null) { list = new JList(); list.setBounds(new Rectangle(204, 12, 441, 215)); } return list; } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { MsnClient thisClass = new MsnClient(); thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); thisClass.setVisible(true); } }); }
  38. 38. public MsnClient() { super(); initialize(); try { msn = (Msn) Naming.lookup("rmi://localhost:1099/MsnService"); } catch (Exception e) { System.out.println("MSN RMI hatasi: " + e.getMessage()); } // yeni bir thread oluştur Thread t = new Thread(this); t.start(); }
  39. 39. @Override public void run() { while(true) { try { list.setListData(msn.mesajAl()); } catch (RemoteException e) { System.err.println(e.getMessage()); } } } private void initialize() { this.setSize(684, 400); this.setContentPane(getJContentPane()); this.setTitle(“Chat Uygulaması"); }
  40. 40. private JPanel getJContentPane() { if (jContentPane == null) { lbl02 = new JLabel(); lbl02.setBounds(new Rectangle(18, 227, 150, 113)); lbl02.setText(" EMRAH"); lbl01 = new JLabel(); lbl01.setBounds(new Rectangle(17, 30, 142, 104)); lbl01.setText(" VOLKAN"); jContentPane = new JPanel(); jContentPane.setLayout(null); jContentPane.add(getTxt01(), null); jContentPane.add(lbl01, null); jContentPane.add(lbl02, null); jContentPane.add(getBtn(), null); jContentPane.add(getList(), null); } return jContentPane; } }
  41. 41. Kaynaklar http://tr.wikipedia.org/wiki/CORBA Java Remote Method Invocation - Geylani KARDAŞ Introduction to Java Programming 6. Edition Y.Daniel Liang

×