Serdar BAKIR Deniz ÜNAL Harun AYDIN Kocaeli Universitesi Bahar 2012 JAVA RMI Serdar BAKIR Deniz ÜNAL Harun AYDIN Kocaeli Universitesi Bahar 2012
İÇİNDEKİLER Uzak Nesne Kavramı Remote Method Invocation(RMI) RMI Mimarisi RMI Uygulaması Yaratmak Kaynakça
Uzak Nesne Kavramı Nesneye dayalı analiz ve tasarım metodolojilerinin popülerleşmesi ve buna dayalı olarak ortaya çıkan nesne tabanlı bilgisayar yazılımlarının farklı makineler üzerinde haberleşmesi ihtiyacı yüzünden uzak nesne kavramı ortaya çıkmıştır. Hedeflenen; farklı makineler üzerinde çalışan nesnelerin birbirleri ile doğrudan mesajlaşmasını sağlamaktır. Yapısal sistemlerde dağıtık süreçler arasında kullanılan RPC (Remote Procedure Call) mekanizmasına benzer şekilde standart bilgisayar ağı protokolleri (örneğin TCP/IP) üzerinden nesnelerin birbirleri ile haberleşmesi düşünülmüş ve buna dayalı mimariler gerçekleştirilmiştir.
Remote Method Invocation(RMI) Java RMI programcının dağıtık java teknolojisi tabanlı uygulamalar geliştirebilmesini sağlar. Farklı yerlerde bulunabilen Java sanal makinelerinden uzak Java nesnelerinin metotları çalıştırılabilir. Uzak Metot Çagrımı (RMI) ilk olarak JDK 1.1 ile gündeme gelmis ve ag programlamayı daha yüksek seviyelere tasımıstır. Uzak Metot Çagrımı’nın kullanımının nispeten kolay olmasının yanında fark edilir güçte teknolojiler arasında gösterilebilir.
Remote Method Invocation(RMI)
Remote Method Invocation(RMI) Java RMI ağ işlemleri için kullanıcıya soket ve streamlere göre daha üst düzeyde bir ara yüz sunmaktadır. Bu nedenle, RMI ile dagıtık programlama yapmak soket ve stream kullanımına göre daha az karmasıktır. Programcı açısından bakıldıgında, RMI kullanıldıgında istemci/sunucu uygulamaların gelistirilmesi sırasında ag islem alt düzeydeki ayrıntıları ile ugrasmak gerekmemektedir.
RMI Mimarisi RMI mimarisi 3 bağımsız katmandan oluşur. Bu katmanlar Java uygulaması ile JVM arasında bulunur. Stub and Skeleton Layer : Bu katman sıralama, network üzerinden gönderilen verinin tekrar orjinal haline dönme işleri, bu verileri alarak Remote Referans Layer’a iletme işlerinden sorumludur. Network üzerinden veri gönderme ve bu verilerin tekrar orjinal haline dönme işleri serialization ile gerçekleştirilir.
RMI Mimarisi Remote Reference Layer : Bu katman isteklerin yürütülme işlerinin gerçekleştirilmesinden sorumludur. Transport Layer : Bu katman ise bağlantı ayarları, gelen istekleri yönetme, görüntüleme ve gelen istekleri dinleme gibi işlerden sorumludur.
RMI Mimarisi Java RMI 3 ana başlık altında incelenir. Java RMI servers : Bu sunucu Java RMI arayüzünü implemente eder ve RMI kayıt kütüğüne (registry) nesneyi kaydeder. Java RMI registry : Tüm uzaktaki objeleri izler. Java RMI sunucusunun sunucu sınıfının iskeletine erişmesi gerekir. Uzaktaki objenin iskeleti dediğimiz şey uzak objelerin metodlarına çağrım yapan sunucu taraflı entity’lerdir.
RMI Mimarisi Java RMI clients : Önce uzaktaki objelere erişmek için RMI registry’sine bakar. İstemcilerin sunucu sınıfına erişebilmesi gerekir. Bunun için stub adı verilen istemciler için bir proxy vardır. Bu stub uzaktaki objeler için desteklenen tüm arayüzleri implement eder. Stublar ve iskeletler client server arasındaki iletişimi sağlamak amacıyla kullanılırlar.
RMI Mimarisi
RMI Mimarisi Java RMI sunucu programı, istemci tarafından çağrılacak olan nesnenin instance’ını yaratarak JAVA RMI kayıt kütüğüne (registry) ekler. Java RMI client programı, registry’ye bakarak uzaktaki objeye erişmek için girişimde bulunur. Java RMI Registry’si istemciye uzaktaki objenin stub’ının serialize edilmiş halini döner. İstemci de bu nesneyi alır, deserialize eder ve instance’ını yaratır. Client bu stub’ı kullanarak uzaktaki objenin metodlarından birisini çağırır. Stub, RMI Server içerisindeki iskelet ile bağlantı kurar. Bu iskelet istekte bulunulan nesnenin (remote object) metodlarından birisini çağırır. Cevap iskelete döner. İskelet cevabı istemciye döndürür. İstemcideki stub da cevabı alır ve programa iletir.
Java RMI Uygulaması Yaratmak Uzaktaki objeyi (remote object) tanımlayan bir arayüz geliştirilir. Bu arayüz (interface) java.rmi.Remote adındaki arayüzden türemelidir. Bu arayüzü implement eden bir sınıf tasarlanır. (Servent sınıfı) Servent instancelarını yöneten bir server yaratılır. Yaratılan sunucu aynı zamanda registry’ye kayıt işlemlerinden de sorumludur. Uzaktaki objeleri kullanan bir istemci yaratılır. İstemcide kayıt kütüğüne sorgu yapılarak alınan nesne üzerinden istenilen metotlara istek gönderilir.
Java RMI Uygulaması Yaratmak 1 İlk olarak bir bilgisayarda Server uygulamamızı yazacağız. Önce NetBeans IDE ‘yi açıp File->New Project ‘i seçiyoruz. Açılan pencerede Java Application’ı seçip next diyoruz.
Java RMI Uygulaması Yaratmak 2 Proje ismimizi ve package ismimizi girip Finish’e tıklıyoruz.
Java RMI Uygulaması Yaratmak 3 Server klasımızın içini doldurmadan önce, server ile client arasındaki bağı sağlayacak olan interface’i oluşturacağız. Bunun için paketimizin ismine sağ tıklayıp new sekmesinden Java Interface’i seçiyoruz.
Java RMI Uygulaması Yaratmak 4 Interface ismimizi ve Package ismini girip Finish’e tıklıyoruz.
Java RMI Uygulaması Yaratmak 5 Interface’imize java.rmi.Remote ve java.rmi.RemoteExeption klaslarını import ediyoruz. Ayrıca Remote klasını da extend ediyoruz. Daha sonra interface’te bulunması istenen metotlarımızı yazıyoruz. Burada String döndüren sayHello() metodumuz bulunmakta. Görüldüğü gibi metoda ulaşmada sorun olduğunda RemoteException fırlatabilmesi için bir bildirim yapılıyor.
Java RMI Uygulaması Yaratmak 6 Server klasımızda da gereken rmi klaslarını import ettik ve interface’imizi de implemente ediyoruz. Bundan sonra boş bir constructer methodumuzu yerleştirdik ve Hello interface’inden gelen sayHello() metodumuzu «Hello» Stringi döndürecek şekilde doldurduk.
Java RMI Uygulaması Yaratmak 7 Main metodumuzda da ServerRMI klasından ve Hello interface’inden birer nesne oluşturup 1050 portunda bir stub nesnesi oluşturuyoruz. Registry’ye stub nesnemizi Hello adıyla bildiriyoruz. Oluşabilecek hataları try catch blokları ile kontrol ettikten sonra serverımız çalışmaya hazır.
Java RMI Uygulaması Yaratmak 8 Artık client uygulamamızı yazabiliriz. Aynı server uygulamamızdaki gibi New project’e tıklayarak yeni bir proje oluşturyoruz. Burada dikkat etmemiz gereken şey package adlarının serverla aynı olması. Görüldüğü gibi client’ımızın da package adı Rmi. Aynı Hello interface’imiz burada da var. İçerik olarak da tamamen aynısı. Yine ilk olarak onu ekleyerek başlıyoruz.
Java RMI Uygulaması Yaratmak 9
Java RMI Uygulaması Yaratmak 9 ClientRMI klasımızda da yine boş bir constructer metdomuz var. Main metodunda Server’ın bulunduğu IP adresi, bağlanacağımız port numarası paremetreleri ile bir Registry nesnesi oluşturuyoruz. Böylece server’a bağlanmış sayılabiliriz. Hello türündeki nesneyi server tarafında «Hello» adıyla bildirdiğimizi hatırlarsınız. Burada da o nesneyi registry’den «Hello» adıyla buldurarak programımıza katıyoruz. Nesnedeki sayHello metodunun cevabını da ekrana yazdırıyoruz. IP adresinin 127.0.0.1 olması localhost’ta aynı bilgisayara bağlanılacağını göstermektedir. Yani server da client da aynı bilgisayardadır.
Java RMI Uygulaması Yaratmak 10 Artık hem client hem de server uygulamamız hazır olduğuna göre ilk olarak server uygulamasını çalıştırara deneyebiliriz. ServerRMI.java dosyasına sağ tıklayıp Run File ‘a tıklıyoruz. Konsol output pencesinde yukarıdaki gibi çıktılar olması gerekiyor.
Java RMI Uygulaması Yaratmak 11 Aynı şekilde ClientRMI.java dosyasını çalıştırdığımızda aşağıdaki gibi bir çıktıyla karşılaşıyoruz. Burada «Hello!» yazısı server uygulamamızdaki sayHello() metodundan gelen cevaptır.
Kaynakça Java RMI, William Grosso, O'Reilly Media,2001 http://notes.corewebprogramming.com/student/RMI.pdf http://www.universalteacherpublications.com/Java/rmi/index.htm http://docs.oracle.com/javase/jndi/tutorial/objects/storing/remote.html http://belgeler.cs.hacettepe.edu.tr/yayinlar/eski/CORBA_20122034.pdf