16
1.1 ( 분분 분분 분분 ) RMI RMI 익익익 1. 익익익익익익 익익익익 message-passing 익 익익익 bounded-buffer 익익 익익익익익 익익익 익익익 . 익익 익익 : ftp://117.16.244.157 -> os -> OSJavaSources - > ch15 -> rmi http :// marvel.incheon.ac.kr 익 InformationUnix RMI 익익 2. 익 , 익 익익익 익 익익익 익익익 익 익익익 익익익 익익익 . 익 익익익익익 익익익익익익 익 익익익 Producer 익 Consumer 익 익익익 익익익익익익 Java applet 익 익익익 익익 익익익익 . AppletViewer 익익 익익익익익 익익익익익익익 익익 익익익익 multi.incheon.ac.kr(117.16.244.157) 익 익익익익 익익 익익익익익 익익 익익익 익익 익익익익 . 익익 익익익익 MessageQueueImpl 익 multi 익 익익익익 , 익익익익익 익익익익 Factory 익 익익익 익익익 익익 익익익 익익익 . (Linux 익익 익익익 익익 익익익 )

(분산 통신 실습) RMI

Embed Size (px)

DESCRIPTION

(분산 통신 실습) RMI. RMI 익히기 분산환경에서 동작하는 message-passing 을 이용한 bounded-buffer 해법 프로그램을 실행해 보세요. 소스 코드: ftp://117.16.244.157 -> os -> OSJavaSources -> ch15 -> rmi http :// marvel.incheon.ac.kr 의 Information Unix RMI 참조 - PowerPoint PPT Presentation

Citation preview

Page 1: (분산 통신 실습)  RMI

1.1

( 분산 통신 실습 ) RMI RMI 익히기

1. 분산환경에서 동작하는 message-passing 을 이용한 bounded-buffer 해법 프로그램을 실행해 보세요 .

소스 코드 : ftp://117.16.244.157 -> os -> OSJavaSources -> ch15 -> rmi

http:/ / m arv el.incheon.ac.kr의 InformationUnix RMI 참조2. 또 , 이 예제가 웹 상에서 수행될 수 있도록 수정해 보세요 . 즉 클라이언트

프로그램에서 이 예제의 Producer 와 Consumer 의 동작을 모니터링하는 Java applet 을 작성해 보는 것입니다 .

AppletViewer 또는 넷스케이프 커뮤니케이터로 실행

실습방법 multi.incheon.ac.kr(117.16.244.157) 의 숙제방에 소스 프로그램과 실행

파일을 옮겨 놓으세요 . 서버 프로그램 MessageQueueImpl 은 multi 에 실행하고 , 클라이언트

프로그램 Factory 는 윈도우 컴퓨터 에서 실행해 보세요 . (Linux 에서 컴파일 오류 디버깅 )

Page 2: (분산 통신 실습)  RMI

1.2

RMI (Remote Method Invocation) RPC 의 Java 버전

저수준 (low-level) 소켓을 이용하지 않고 원격 객체의 메소드를 호출할 수 있는 방법을 제공하는 객체 지향 언어인 Java 기반의 분산 컴퓨팅 환경 ( 클라이언트 / 서버 지원 ) 을 위한 미들웨어 (RPC 와 유사 )

스레드 (thread) 가 원격 객체 (Remote Object) 의 메소드 (method) 호출

다른 Java Virtual Machine 상에 있는 객체는 “원격” 객체 RPC 보다 좋은점

객체 지향적이다 . 프로그램 작성 및 사용이 쉽다 . 안전하고 보안성이 있다 . 기존 시스템과 통합해서 사용할 수 있다 .

작성 절차 원격 인터페이스를 정의한다 . 원격 인터페이스를 구현 (implement) 하는 원격 객체 ( 서버 ) 를

작성한다 . 원격 객체를 이용하는 프로그램 ( 클라이언트 ) 을 작성한다 . stub 와 skeleton 클래스를 생성한다 . rmiregistry 를 실행시킨다 . 서버와 클라이언트를 실행시킨다 .

Page 3: (분산 통신 실습)  RMI

1.3

RMI (Remote Method Invocation)

Page 4: (분산 통신 실습)  RMI

1.4

RMI (Remote Method Invocation) RPC versus RMI

RPC : Procedural Programming Style RMI : Object-Oriented Programming Style RPC 의 매개변수 : Ordinary Data Structures RMI 의 매개변수 : Objects

Stubs and Skeletons “Stub”

클라이언트에 상주하는 원격 객체의 대리인 (proxy) 매개변수들을 “Marshalls”( 메소드 이름과 인자들의 꾸러미 생성 )

해서 서버로 보냄 “Skeleton”

서버에 상주 매개변수를 “Unmarshalls” 해서 서버에 전달함

매개변수 Marshall 된 매개변수가 Local (Non-Remote) Objects 이면 객체를

바이트 스트림으로 기록해 주는 객체 순서화 (Object Serialization) 기법을 이용해서 복사에 의해 (by Value) 전달

Marshall 된 매개변수가 Remote Objects 이면 참조에 의해 (by Reference) 전달 : RMI 의 장점

Remote objects java.rmi.Remote 를 확장한 Interface 로 선언되어야 함 … extends java.rmi.Remote 모든 메소드는 java.rmi.RemoteException 을 발생시켜야 함 … throws java.rmi.RemoteException

Page 5: (분산 통신 실습)  RMI

1.5

Marshalling Parameters

Page 6: (분산 통신 실습)  RMI

1.6

RMI 프로그램 예제

MessageQueueImpl.javaserver

MessageQueue.java

원격 인터페이스 구현

Factory.java

Consumer.java

Producer.java

javac

rmic

MessageQueueImpl_skel.class

MessageQueueImpl.class

javac

MessageQueueImpl_stub.class

Factory.class

client

Page 7: (분산 통신 실습)  RMI

1.7

RMI 프로그램 예제 구성

원격 인터페이스 : MessageQueue.java 서버 프로그램 : MessageQueueImpl.java 클라이언트 프로그램 : Factory.java, Producer.java, Consumer.java

Policy File : New with Java 2

grant {

permission java.net.SocketPermission "*:1024-65535","connect,accept";

};

Page 8: (분산 통신 실습)  RMI

1.8

RMI 프로그램 예제 실행 순서

1. 모든 소스 파일 컴파일$ javac MessageQueue.java MessageQueueImpl.java

Factory.java Producer.java Consumer.java

2. rmic 로 stub 와 skeleton class 파일 생성$ rmic MessageQueueImpl

3. 레지스트리 서비스 시작 (rmiregistry) … osagent 또는 rpcbind 디몬에 해당

$ rmiregistry & (Unix & Linux)

또는 C:\> start rmiregistry (Windows)

4. 원격 서버 객체의 인스턴스 생성 (JDK 1.2 이상 버전에서는 인증해 주어야 함 )

$ java -Djava.security.policy=java.policy MessageQueueImpl (JDK 1.2 이상 )

또는 $ java MessgeQueueImpl (JDK 1.1)5. 클라이언트에서 원격 객체 실행 시작

$ java -Djava.security.policy=java.policy Factory (JDK .2 이상 )또는 $ java Factory (JDK 1.1)

Page 9: (분산 통신 실습)  RMI

1.9

RMI 프로그램 예제 서버 : MessageQueue interfaceimport java.util.*;import java.rmi.*; public interface MessageQueue extends java.rmi.Remote { /* * This implements a non-blocking send */ public void send(Object item) throws java.rmi.RemoteException; /* * This implements a non-blocking receive */ public Object receive() throws java.rmi.RemoteException;}

Page 10: (분산 통신 실습)  RMI

1.10

RMI 프로그램 예제

서버 : MessageQueueImpl.java (1)import java.util.*;import java.rmi.*; public class MessageQueueImpl extends

java.rmi.server.UnicastRemoteObject implements MessageQueue { public MessageQueueImpl() throws RemoteException { queue = new Vector(); } // This implements a non-blocking send public synchronized void send(Object item) throws RemoteException { queue.addElement(item); System.out.println("Producer entered " + item + " size = " +

queue.size()); }

Page 11: (분산 통신 실습)  RMI

1.11

RMI 프로그램 예제

서버 : MessageQueueImpl.java (2)

// This implements a non-blocking receive

public synchronized Object receive() throws RemoteException {

Object item;

if (queue.size() == 0)

return null;

else {

item = queue.firstElement();

queue.removeElementAt(0);

System.out.println("Consumer removed " + item + " size = " + queue.size());

return item;

}

}

Page 12: (분산 통신 실습)  RMI

1.12

RMI 프로그램 예제 서버 : MessageQueueImpl.java (3) public static void main(String args[]) {

System.setSecurityManager(new RMISecurityManager());

try {

MessageQueue server = new MessageQueueImpl();

Naming.rebind("//127.0.0.1/MessageServer", server);

//Naming.rebind("rmi://media.inchon.ac.kr/MessageServer", server);

System.out.println("Server Bound");

}

catch(Exception e) {

System.err.println(e);

}

}

private Vector queue;

}

Page 13: (분산 통신 실습)  RMI

1.13

RMI 프로그램 예제 클라이언트 : Factory.java (1)import java.util.*;import java.rmi.*; public class Factory { public Factory() { // remote object

MessageQueue mailBox; System.setSecurityManager(new RMISecurityManager()); // install a security managertry {

//get a reference to the remote object mailBox =

(MessageQueue)Naming.lookup(“//127.0.0.1/MessageServer");//(MessageQueue)Naming.lookup("rmi://media.inchon.ac.kr/MessageServer");

// now create the producer and consumer threads

Producer producerThread = new Producer(mailBox); Consumer consumerThread = new Consumer(mailBox); producerThread.start(); consumerThread.start();

}catch (Exception e) {

System.err.println(e);}

}

Page 14: (분산 통신 실습)  RMI

1.14

RMI 프로그램 예제

클라이언트 : Factory.java (2)

// producer and consumer will call this to nap

public static void napping() {

int sleepTime = (int) (NAP_TIME * Math.random() );

try { Thread.sleep(sleepTime*1000); }

catch(InterruptedException e) { }

}

public static void main(String args[])

{

Factory client = new Factory();

}

private static final int NAP_TIME = 5;

}

Page 15: (분산 통신 실습)  RMI

1.15

RMI 프로그램 예제 클라이언트 : Producer.javaimport java.util.*; class Producer extends Thread{ public Producer(MessageQueue m) { mbox = m; } public void run() {

Date message; while (true) { Factory.napping(); // produce an item & enter it into the buffer message = new Date();

try { mbox.send(message);

System.out.println(“Producer Produced ” + message); }

catch (Exception e) {System.err.println(e);

} } } private MessageQueue mbox;}

Page 16: (분산 통신 실습)  RMI

1.16

RMI 프로그램 예제 클라이언트 : Consumer.javaimport java.util.*;class Consumer extends Thread { public Consumer(MessageQueue m) { mbox = m; } public void run() { Date message; while (true) {

Factory.napping(); // consume an item from the buffertry {

message = (Date)mbox.receive(); if (message != null) // Consume the item

System.out.println(“Consumer Consumed ” + message);

}catch (Exception e) {

System.err.println(e);}

} } private MessageQueue mbox;}