Site Search :
Standard Enterprise XML Methodology Pattern Setting Tunning Other
Article Contributors
GuestBook
Javapattern Maven
XSourceGen Dev
JetSpeed Test
JLook Image
jLook Family Site


RMI programming, The Lifecycle of server
 
1.RMI Programming절차
2.The Lifecycle of RMI Server ( 2003/02/28 ) 73
Written by specular - 전홍성
1 of 1
 

※ RMI Programming, The Lifecycle of an RMI Server 

 
RMI(Remote Method Invocation)는 Distributed Object(분산객체)를 지원하는 Java Tech.입니다. 
즉 다른 Virtual Machine에 생성되어 있는 분산객체의 method를 호출할수 있는 기능을 
제공해 주는 것이죠. RMI application은 Server, Client, Naming service의 세가지 부분으로 
구성이 됩니다.
RMI Server는 분산객체를 생성해 Naming Service에 분산 객체를 등록하고, Client의 
remote method call Request를 처리하고, RMI Client는 Naming Service로 부터 분산객체의
remote reference를 얻어 remote reference를 이용해서 server에 생성되어 있는 분산객체의 
method call의 request를 합니다. 그리고, Naming service는 분산객체에 대한 remote reference의
정보를 service하는데, JDK의 rmiregistry로 제공됩니다. 

◆ RMI Programming 
1. remote interface 개발 : 분산 객체에 대한 client interface를 정의

  import java.rmi.Remote;
  //반드시 Remote interface type정의 
  public interface Echo extends Remote 
  {
	//반드시 RemoteException을 throws해야 한다.
	public String sayEcho(String name) throws RemoteException;
  }
2. Servant 개발 : 분산객체를 정의

  import java.rmi.*;
  // remote interface 구현
  public class EchoImpl implements Echo 
  {
  	public String sayEcho(String name) 
  	{
  		System.out.println("EchoImpl.sayEcho() method");
  		return "Hi... "+name+"\n";
  	}
  }
3. Server Application개발 : Servant생성, Naming service에 등록 
import java.io.*;
import java.rmi.*;
import java.rmi.registry.*;

public class Server 
{
public static void main(String args[]) 
{
  try {

	//1.create an object
	EchoServer serv = new EchoServer();

	//2.export the object 
	Echo remoteObj = (Echo)UnicastRemoteObject.exportObject(serv);

	//3.get a stub object of naming service daemon 
	Registry r = LocateRegistry.getRegistry("localhost",1099);      
	//  register the servant to naming service
	r.rebind("ECHO", remoteObj);

	InputStreamReader isr = new InputStreamReader(System.in);
	BufferedReader rdr = new BufferedReader(isr);

	//4.Serve clients
	while (true) {
		System.out.println("Type EXIT to shutdown the server.");
		if ("EXIT".equals(rdr.readLine())) {
			break;
		}
	}

	//5.unregister object
	r.unbind("ECHO");

	//6.unexport object
	UnicastRemoteObject.unexportObject(serv, true);
  } catch (Exception e) {
	e.printStackTrace();
  }  
}
}
Step 1 : remote로 service되어질 Distributed object를 생성(Servant 생성) 
Step 2 : servant를 export한다. RMI system에 Servant object가 remote VM에 
available하다라는것을 inform한다. exportObject()의 결과는 분산객체의 Stub객체인데,
이 Stub은 분산객체에 대한 remote reference, 분산객체에 대한 Proxy object이다. 
UnicastRemoteObject로 부터 상속을 받아 servant를 개발할 경우 이단계는 
UnicastRemoteObject Contstructor 에서 내부적으로 실행된다. 
Step 3 : RMI Naming service daemon인 rmiregistry에 접근하기 위한 interface를 얻어낸다. 
그리고, 분산객체의 Stub object를 rmiregistry에 등록한다. 물론 이 작업은 java.rmi.Naming이라는
class를 이용해도 된다. 
Step 4 : Server application의 종료를 keyboard로 부터 "EXIT"를 입력할때까지 wait시킨다. 
Step 5 : Server application의 종료전 rmiregistry에 등록된 servant의 remote reference인 
Stub object를 deregister한다. 
Step 6 : RMI system에서 분산객체를 unexport한다. 
Step 7 : 분산객체를 Garbage collection한다. 

4. Client Applicaton 개발 

import java.rmi.*;

public class Client 
{
public static void main(String args[]) 
{
  try {
	System.out.println("Connecting to echo server...");
	Echo e = (Echo) Naming.lookup("ECHO");
	String result = e.echo("Hello");
	System.out.println("Echo returned " + result);
  } catch (Exception e) {
	e.printStackTrace();
  }
}
}

5. Compile

	prompt>javac *.java


6. Stub, Skeleton class 생성

	prompt>rmic EchoImpl
 
 ◆ 실행 

	1.prompt>rmiregistry
	2.prompt>java Server
	3.prompt>java Client
 
2001.05.12 written by Jeon HongSeong
 
1
References
 
Copyright ⓒ 2003 www.javapattern.info & www.jlook.com, an jLOOK co.,LTD