본문 바로가기

자바

JAVA RMI

1. RMI 개념


분산 시스템을 자바에서 지원해 주는 패키지가 rmi이다.

 

RMI란 원격 메서드 호출로 네트워크상에서 떨어져 있는 객체의 메서드를 투명하게 호출하는 것을 말한다.

 

네트워크로 연결된 다른 컴퓨터에 존재하는 메서드를 다른 컴퓨터에서 마치 내 컴퓨터에 있는 듯이 호출해서

 

사용하게끔 해주는 것이 바로 java.rmi 패키지이다.

 

여기서 네트워크상에 떨어져 있는 객체를 Remote객체(또는 원격객체)라 하고 이를 호출하는 것을

 

local 객체(또는 로컬 객체)라 한다.

 


RMI도 PRC와 마찬가지로 프로그래머가 소켓 통신에 대한 고려 없이 RMI관련 클래스만으로 프로그램을 작성하면 그외

 

모든 네트워크 관련 처리라든지 하는 여러 처리를 담당해 준다. 따라서 RMI를 이용하면 복잡한 소켓 프로그래밍 없이

 

네트워크 응용을 만들 수있다.

 

 

 

 

2. 메소드 호출과정

 

 

 

 

 

3. RMI 구성하기

 

1) 원격 인터페이스 만들기

 

import java.rmi.*

 

public interface MyRemote extends Remote {

 // 원격 메소드의 인자 및 리턴 값은 모두 원시 형식이나 Serializable 로 구현되어야 한다.

 // 왜냐하면 네트워크로 통신할 때 직렬화를 통하여 포장되어 전송되기 때문이다.

 // 사용자가 직접 만든 객체를 전송하고 할 경우에는 그 내부에 Serializable 인터페이스를 구현하면 된다.
 public String sayHello () throws RemoteException;
}

 

 

2) 원격 서비스 구현 클래스 만들기

 

import java.rmi.*;
import java.rmi.server.*;

 

public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote {
 public String sayHello(){
  return "Server says 'hey' ";
 }

 public MyRemoteImpl () throws RemoteException{}

 public static void main(String args[]){
  try{
   MyRemote service = new MyRemoteImpl();

   // 원격서비스를 하려면 rmi 레지스트리에 서비스를 등록해야 하는데 rebind(서비스별칭, 서비스 객체) 로 등록된다

   // MyRemote 의 구성으로 MyRemoteImpl 객체를 등록하는 소스이다.
   Naming.rebind("RemoteHello",service);
  }catch(Exception e){
   e.printStackTrace();
  }
 }
}

 

 

3) 스터브와 스켈레톤 생성

 

만들어진 MyRemoteImpl 클래스를 실행하여 rmi 레지스트리에 저장한다.

 

스터브와 스켈레톤은 본래 파일명_Stub.class, 본래 파일명_Skel.class 로 생성되며

 

생성할 디렉토리에서 cmd 커멘드로

 

>rmic MyRemoteImpl

 

라고 실행하면 된다.


 

 

4) rmi 레지스트리 실행

 

cmd 명령어로

 

>rmiregistry

 

를 실행하면 되는데 되로록이면 클래스들이 위치한 디렉토리 경로에서 실행하는 것이 좋다.

 

보통 /classes  에서 하곤한다.

 

 

 

5) 서비스 실행

 

cmd 명령어로

 

>java  MyRemoteImpl

 

를 실행하면 된다.

 

이때 만드시 rmiregistry 와 다른 cmd 창에서 실행하야한다.

 

둘이 모두 돌아가는 상황이어야 한다는 것

 

 

 

4. RMI 작동하기

 

 

 

 

 

1) 클라이언트 객체 만들기

 

import java.rmi.*

 

public class MyRemoteClient{
 pubic static void main(String args[]){
  new MyRemoteClient().go();
 }

 public void go(){
  try{

      //rmi 레지스트리 서버에서 해당 스터브를 받아서 메소들를 호출한다.

      //rmi://레지스트리서버IP주소/호출하고자하는서비스별칭 <- rebind 에서 지정한 이름을 말한다.     

      MyRemote service = (MyRemote)Naming.lookup("rmi://127.0.0.1/RemoteHello");

     String str = service.sayHello();
  }catch(Exception e){
   e.printStackTrace();
  }
 }
}

 

 

 

여기서 헷갈리지 말자 rmi 레지스트리 서버는

 

말그대로 서버다

 

원격지원하는 서버에 같이 올라가 있어야 하는 것으로 클라이언트는 해당 ip 주소로 통신하여 스터브 스켈레톤을 통하여

 

원하는 리턴 값을 받을 수 있게 되는것이다.

 

다시말하면 클라이언트에서는 스터브라든지 스켈레톤이라든지가 필요없는거다

 

단지 정확한 lookup 만하면 rmi 레지스트리 서버에서 스터브를 받고 그 스터브로 스켈레톤과 통신하게 되는것

 

 

 

 출처 : http://cafe.naver.com/junes81/387

 


'자바' 카테고리의 다른 글

Timestamp 변수에 데이터 넣기  (0) 2014.04.15
RMI  (0) 2014.03.17
모듈별(단위별) 테스트  (0) 2014.02.27
Swing 예제  (0) 2014.02.27
AWT 레이아웃의 종류  (0) 2014.02.25