Archive for the ‘ Remote Method Invocation (RMI) ’ Category

    Uzak Metod Çağrısı(Remote Method Invocation-RMI)
Bir makina üzerinde çalışan bir java nesnesinin, başka bir makina üzerinde çalışan diğer bir java nesnesinin
metodunun çağırmasını sağlar.Bu da dağıtık uygulama inşa etmemizi sağlar.
Bir çok java kütüphanelerinden bir tanesidir bu. Ilk önce sunucyu yanı SunucuSinifimiz.java sınıfını çalıştırıyoruz.Sonra IstemciSinifi.java sınıfımızı çalıştırıyoruz.Resimde sağda kırmızı işaret sunucunun çalıştırmakta olduğunu gösterir http://prntscr.com/5370 .Bu uygulama localhostta çalışıyor.

package www.ethemsulan.com;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.rmi.AccessException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
public class SunucuSinifimiz extends
 UnicastRemoteObject implements ArayuzMesAl{
//Sunucu makinenin ana programını içeriyor
//java.rmi altında bulunan Naming sınıfına ait 
//rebind() metodu bu makinedeki RMI kaydını günceller
//Metodun birinci parametresi sunuc olarak adlandırılan sınıf ismi
//ikinci parametre ise this(hangisi gelirse) bir referans sağlamasıdır.
	Registry kaydimiz;
	String adresimiz;
	int portumuz;
protected SunucuSinifimiz() throws RemoteException {
//üst sınıftaki yapıcları çağırır.
		super();
	}
private void sunucyuHazirla(){
	try {
adresimiz=(InetAddress.getLocalHost().toString());
	} catch (UnknownHostException e) {
			e.printStackTrace();
		}
		portumuz=1317;
System.out.println("Adresimiz: "+adresimiz+"\tPortumuz: "+portumuz);
//IstemciSinifi daki portu günceler.Bu portu dinlemeye alır.
//Ağ uygulamasındaki gibi.
		try {
kaydimiz=LocateRegistry.createRegistry(portumuz);
		} catch (RemoteException e) {
			e.printStackTrace();
		}
		try {
kaydimiz.rebind("YerelArabirimim", this);
		} catch (AccessException e) {
			e.printStackTrace();
		} catch (RemoteException e) {
			e.printStackTrace();
		}
	}
//interfaceyi implemente ettik ve ona ait metodla console yazdiiryoruz.
public void mesajAl(String girilen) throws RemoteException {
	System.out.println(girilen);
		}
public static void main(String[] args) {
		try {
SunucuSinifimiz nesnem=new SunucuSinifimiz();
	nesnem.sunucyuHazirla();
	} catch (RemoteException e) {
			e.printStackTrace();
		}
	}
}

Orj kod:http://www.ethemsulan.pastebin.com/4Z2BMZjQ

package www.ethemsulan.com;
import java.rmi.AccessException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import javax.swing.JOptionPane;
public class IstemciSinifi {
//Bu sınıf dağıtık uygulamanın istemci tarafını gerçekleştirir.
//Ilk deger olarak sunucu makinesinin ip adresi veya ismi
//Diger degerlerde gonderilecek string ya verilen paramtereler her ne olursa
//Biz bunu localhostta yaptik ama uzaktaki bilgisayarlarada ayni amnatıktır.Bu degerler
//lookup() metodu rmi den bir nesne alır ve referans olarak
//ArayuzmesAl tipine referans dönderir.Uzak metod çağırıları bu nesneye yönlendirilebilir
//mesajAl metodu çağrılır ve sonuç üretip geri dönderilip yazılır.
public static void main(String[] args) {
String girilen=JOptionPane.showInputDialog("Bir deger girin");
		ArayuzMesAl mail = null;
		Registry kayit = null;
		try {
//localhost ve belirtilen port ben 1317 yi seçtim.Kayıt gerçekleştirir.
//Burdaki port ile SunucuSinifimiz daki port ayni olmalı.
//Yanı iletişim için 1317 kapısını belirledik.Bu kapıdan haberleşecekler
kayit = LocateRegistry.getRegistry("127.0.0.1",1317);
		} catch (RemoteException e) {
			e.printStackTrace();
		}
		try {
//YerelArabirimim referans olarak aldığı değer.Bu değer
//SunucuSinifimizdaki rebind() içindeki verilen isimdir.
mail = (ArayuzMesAl)(kayit.lookup("YerelArabirimim"));
		} catch (AccessException e) {
			e.printStackTrace();
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (NotBoundException e) {
			e.printStackTrace();
		}
		try {
//Interfacedeki metodumuzdur.Sunucuda gelen degeri consolye yazdirdik
			mail.mesajAl(girilen);
		} catch (RemoteException e) {
			e.printStackTrace();
		}
	}
}

Orj kod:http://www.ethemsulan.pastebin.com/0aLc3Jnw

package www.ethemsulan.com;
import java.rmi.Remote;
import java.rmi.RemoteException;
//Bu sunucu tarafından sağlanan uzak arabirimi tanımlar.
//Tüm uzak arabirimler java.rmi paktinin altında bulunan 
//Remote arabirimini genişletmek zorundadır.
//Remotede üye tanımlanamz.Amacı başka yerdeki arabirimin 
//metodlarının kaullanıp kullanmadığını belirtmektir.
public interface ArayuzMesAl extends Remote{
public void mesajAl(String girilen) throws RemoteException;
}

Orj kod:http://www.ethemsulan.pastebin.com/VGvuSF1M