Java RMI (Remote Method Invocation)

Slides:



Advertisements
Similar presentations
3. 메소드와 변수 SCJP 자격증 프로젝트 발표자 : 최선웅. 1. 메 소 드 개 념 2. 메 소 드 양 식 3. 메 소 드 변 수 4. 메 소 드 예 제 5. 참 고 문 헌 / 자 료 목 차.
Advertisements

정보 보안 개론과 실습 네트워크 해킹과 보안 3부 해킹 전 정보 획득 Chapter 10. 목록화.
10. 예외 처리.
클래스 class, 객체 object 생성자 constructor 접근 access 제어 이벤트 event 처리.
김태원 심재일 김상래 강신택. 김태원 심재일 김상래 강신택 인터넷 통신망의 정보를 제공하는 서비스 인터넷의 자원 및 정보는 NIC가 관리 IP주소 또는 도메인으로 정보 검색 이용자 및 통신망 관한 정보를 제공.
Power Java 제3장 이클립스 사용하기.
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 11장 프로세스간 통신 인공지능실험실 석사 2학기 이희재
최윤정 Java 프로그래밍 클래스 상속 최윤정
제14장 원격 메소드 호출 김 기 환. 조 명 휘.
Ch.07-5 xml-rpc 사용하기 김상엽.
1. Windows Server 2003의 역사 개인용 Windows의 발전 과정
Network Lab. Young-Chul Hwang
PHP입문 Izayoi 김조흔.
소켓 모델 주소 지정 in_addr_t inet_addr(const char *ip_address) 연결 지향 모델 (TCP)
JAVA 언어로 배우는 디자인 패턴 입문 chap. 1-2.
메소드 호출과 힙 원격 메소드 호출 서블릿 엔터프라이즈 자바 빈즈
Java RMI (Remote Method Invocation)
Java RMI (Remote Method Invocation)
3. 자바에서 지원하는 패키지 자바에서 기본적으로 제공하는 패키지.
Chapter 4. 클래스와 객체 PS Lab. 이지연.
Lesson 5. 레퍼런스 데이터형.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용 8.3 인터페이스의 상속 8.4 인터페이스 참조
Lesson 9. 예외처리.
네트워킹 CHAPTER 13 Section 1 네트워킹의 개요와 java.net 패키지 Section 2 인터넷 주소와 URL
Lesson 6. 형변환.
Chap08 다중 스레드 8.1 스레드 개요 8.2 Thread 클래스와 스레드 생명주기 8.3 스레드 생성과 사용
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
자바 5.0 프로그래밍.
모바일 자바 프로그래밍 JDBC / WAP Ps lab 오민경.
메시지 큐[5] – test1.c 메시지 제어: msgctl(2) #include <sys/msg.h>
패키지와 접근 제어 패키지에 대하여 접근 제어에 대하여.
Lesson 7. 클래스와 메소드 - 1.
컴퓨터 프로그래밍 실습 #6 제 4 장 클래스 작성.
10장. 예외처리.
자바 5.0 프로그래밍.
15장 네트워킹 15.1 네트워킹의 개요와 java.net 패키지 15.2 인터넷 주소와 URL 15.3 TCP 소켓
Chapter 5 UDP Socket 소켓 프로그래밍.
[INA470] Java Programming Youn-Hee Han
13. 연산자 오버로딩.
7장 인터페이스와 추상 클래스.
Method & library.
RMI Messenger 지도 : 김정배 교수님 조봉진.
HTTP 프로토콜의 요청과 응답 동작을 이해한다. 서블릿 및 JSP 를 알아보고 역할을 이해한다.
Lesson 2. 기본 데이터형.
10. RMI (Remote Method Invocation)
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
프로그래밍 개론 Ⅰ 제 1장 . 서론 ①.
[INA470] Java Programming Youn-Hee Han
자바 5.0 프로그래밍.
Power Java 제11장 상속.
15강. 폼 데이터 값 검증 Validator를 이용한 검증 ValidationUtils 클래스
JA A V W. 06.
네트워크 환경 구축과 이미지 전송 호스트/타겟 통신 직렬 통신을 이용한 이미지 전송 수퍼 데몬 BOOTP 환경 구축
12강. 컨트롤러 컨트롤러 클래스 제작 요청 처리 메소드 제작 뷰에 데이터 전달
Introduction to JSP & Servlet
Java RMI (Remote Method Invocation)
클래스 : 기능 CHAPTER 7 Section 1 생성자(Constructor)
3장 JSP프로그래밍의 개요 이장에서 배울 내용 : JSP페이지의 기본적인 개요설명과 JSP페이지의 처리과정 그리고 웹 어플리케이션의 구조에 대해서 학습한다.
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
컴퓨터 프로그래밍: 실습 1 제 1장 . 서론.
3. 모듈 (5장. 모듈).
MIDP 네트워크 프로그래밍 ps lab 김윤경.
발표자 : 이지연 Programming Systems Lab.
2.가상머신의 탐험 도구, Oolong에 대하여 ps lab 김윤경.
채팅 및 파일전송 프로그램 권 경 곤 김 창 년.
자바 객체 지향 프로그래밍 Ps lab 김윤경.
7 생성자 함수.
6 객체.
JAVA 프로그래밍 16장 JNLP.
Presentation transcript:

Java RMI (Remote Method Invocation) Youn-Hee Han yhhan@koreatech.ac.kr LINK@KOREATECH http://link.koreatech.ac.kr

RMI의 정의 Java RMI (Remote Method Invocation) 지역적으로 멀리 떨어진 다른 가상 머신 (Virtual Machine)에 있는 객체의 Method를 호출하여 실행하는 기술 기본원리 : 1980년대 사용하던 RPC (Remote Procedure Call)방식 클라이언트 객체는 Remote Method를 자신이 지닌 Local Method를 호출하는 것처럼 간단히 수행 RMI Interface RMI Interface Client Server.hello() Server hello() Internet

RMI의 특징 RMI의 특징 단점 복잡한 객체들의 전달과 반환이 가능 저수준 (Low Level)의 프로토콜 설계가 요구되지 않음 원격 메소드의 호출과 리턴값 반환에 대한 트랜잭션 확립 제공 클라이언트에서 복잡한 트랜잭션을 취급할 필요가 없게 됨 처리 능력이 강력한 서버에 계산 작업을 분산 할당 빈약한 하드웨어 자원의 클라이언트에 부담을 주지 않음 단점 사이즈가 크거나 복잡한 객체들이 전달될 때 오버헤드가 큼 네트워크 처리 시간이 다소 느림

RMI의 특징 Object Serialization Marshaling/Unmarsharling 자바는 매우 편리하게 객체를 직렬화할 수 있는 기능을 지님 Marshaling/Unmarsharling 객체 직렬화의 전문적 용어 Marsharling 파라미터나 반환값들이 네트워크를 통해 전송 될 수 있는 바이트 스트림으로 변환되는 프로세스 Unmarsharling 바이트 스트림을 실제 파라미터 값이나 반환값으로 변환하는 것

RMI의 구조 RMI 계층 모델 RMI Interface 및 Stub 객체 자바에서 제공하는 rmic 컴파일러를 사용하여 서버는 원격 참조 객체 위에서 동작하는 Stub을 생성 Stub 객체 marshals parameter/result data (serialization) unmarshals parameter/result data (deserialization) 논리적 호출 서버 프로그램 클라이언트 프로그램 lookup() 원격 참조 Stub 원격 참조 Stub RMI Interface 전송 계층 전송 계층 TCP/IP TCP/IP 물리적 호출

RMI의 구조 Stub 과 Skeleton의 역할 및 RMI 구조 클라이언트 Stub 에서 서버로 전달되는 information block 원격 객체 식별자 호출 method 식별자 Parameters Primitive Type(Integer, Byte, …)는 copy by value로 전달 Reference Type(String Object, Array Object, …)는 Object Copy로 전달 서버 Stub의 중요 역할 클라이언트 Stub에서 전달된 information block을 해석 remote method가 실행되는 실제 object에 전달 remote method의 호출 결과를 marshall하여 클라이언트 Stub로 return Marshalled parameters parameters Stub Object Stub Object Server Object Marshalled return value Return value Method invocation on client Method invocation on server

RMI 개발순서 RMI 개발순서 1. 서비스할 원격객체의 Remote Interface 작성 2. 원격 객체 및 server program 작성 3. stub 생성 4. RMI Registry 실행 5. Server Program 실행 6. 원격 객체를 사용 할 client program을 작성 7. 서버에서 생성한 stub 파일 copy하여 클라이언트로 가져옴 7. Client Program 실행 (1) Define Remote Interface (2) Implement the Interface javac Class Run the stub compile rmic (3) uses (3) Implement Client Stub uses javac (4) Start RMI Registry Class (5) Start server object (7) Start Client Register remote Objects 7

RMI 관련 패키지 Core packages for RMI: Main interface for RMI: java.rmi java.rmi.server Main interface for RMI: java.rmi.Remote Core classes for RMI: java.rmi.server.UnicastRemoteObject java.rmi.RemoteException java.rmi.Naming 8

서비스할 원격객체의 interface 작성 원격객체가 실제 제공할 모든 메소드의 형태 정의 작성시 반드시 지켜야 할 규칙 java.rmi.Remote 인터페이스 상속받아야 함 반드시 모든 메소드의 접근 지정자는 public 모든 메소드는 java.rmi.RemoteException을 발생 import java.rmi.*; public interface Hello extends Remote { public String sayHello() throws java.rmi.RemoteException; } Hello.java D:/webservice/rmi/server>javac Hello.java Java 소스가 D:/>webservice/rmi에 있음을 가정

원격 객체 및 서버프로그램 작성 원격 인터페이스에서 정의된 메소드들을 실제 구현 작성시 반드시 지켜야할 규칙 원격인터페이스의 모든 메소드 구현 java.rmi.server.UnicastRemoteObject 클래스를 상속 받아야 함 java.rmi.Naming.rebind()메소드를 사용해서 원격객체를 RMI Registry에 등록 HelloImpl.java import java.rmi.*; import java.rmi.server.*; public class HelloImpl extends UnicastRemoteObject implements Hello { } 생성자는 기본적으로 부모클래스의 생성자 호출 public HelloImpl() throws RemoteException { super(); } 원격 객체를 호출한 Client에게 문자열 반환 public String sayHello() throws RemoteException { return "Hello World"; } D:/webservice/rmi/server>javac HelloImpl.java 10

원격 객체 및 서버프로그램 작성 main 함수를 지닌 클래스 정의 java.rmi.Naming.bind()메소드를 사용해서 원격객체를 RMI Registry에 등록 HelloServer.java import java.rmi.*; import java.rmi.server.*; public class HelloServer { public static void main(String[] args) throws Exception { } 새로운 HelloImpl객체를 생성하고 “hello”라는 이름으로 bind HelloImpl h = new HelloImpl(); Naming.bind("//localhost/hello", h); System.out.println("Hello Server ready"); D:/webservice/rmi/server>javac HelloServer.java 11

stub 생성 JDK에서 제공하는 rmic를 실행하여 생성 D:\java\test\RMI>rmic HelloImpl D:/webservice/rmi/server>dir …. Hello.java Hello.class HelloImpl.java HelloImpl.class HelloServer.java HelloServer.class 9개 파일 7,008 바이트 3 디렉터리 2,813,145,088 바이트 남음 D:/webservice/rmi/server>rmic HelloImpl HelloImpl_Stub.class 12

RMI Registry 실행 Remote object의 registry 관리 기본적인 RMI Registry 실행 서버의 원격객체 등록 받고, 클라이언트의 요청에 의하여 서버를 검색해서 클라이언트에게 반환해주는 역할 기본적인 RMI Registry 실행 디폴트 port : 1099 RMI Registry가 실행될 특정 포트번호 지정 서버와 클라이언트에서도 같은 포트번호를 명시적으로 지정 포트 번호 명기 필요성 HelloServer.java Naming.bind("//localhost/hello:5000", h); HelloClient.java Hello h = (Hello) Naming.lookup("//localhost/hello:5000"); Note: HelloImpl 클래스 파일이 있는 디렉토리에서 실행 D:/webservice/rmi/server>rmiregistry D:/webservice/rmi/server>rmiregistry 5000 13

서버 프로그램 실행 서버프로그램 실행 D:/webservice/rmi/server>java HelloServer Hello Server ready 새로운 cmd 창에서 수행 14

Client Program을 작성 서버의 RMI Registry로 부터 Remote Reference 얻어오기 java.rmi.Naming클래스의 lookup()메소드 사용 (형변환 必) Remote Reference 를 통해 원하는 메소드 호출 HelloClient.java import java.rmi.*; public class HelloClient { public static void main(String[] args) throws Exception { System.out.println("HelloClient: " + message); } 서버의 RMI Reistry로부터 원겨참조자 얻어오기 Hello h = (Hello) Naming.lookup("//localhost/hello"); String message = h.sayHello(); 원격객체의 메소드 호출 D:/webservice/rmi/client>javac HelloClient.java 원격지에 생성된 서버 객체에 접근하기 위해서는 localhost 대신에 원격지 컴퓨터의 IP 주소를 입력 15

서버/클라이언트 프로그램 실행 클라이언트 프로그램 실행 클라이언트 컴퓨터 상에 원격객체의 인터페이스와 Stub 클래스 복사함 아래와 같이 실행하여 서버에서 보내준 메시지가 출력되는지 확인 D:/webservice/rmi/client>java HelloClient HelloClient : Hello World D:/webservice/rmi/client> 새로운 cmd 창에서 수행 16

RMI Registry와 관련된 클래스 및 메소드 java.rmi.Naming static Remote lookup(String url) 해당 url에 대한 remote object를 return static void bind(String name, Remote obj) 해당 name을 obj remote object에 binding static void unbind(String name) name의 binding 해제 static void rebind(String name, Remote obj) bind와 같으나 기존 binding이 존재할 경우 대체함 static String[] list(String url) 해당 url에 위치한 registry에 등록된 object url들의 string 배열을 반환

RMI 구현 정리 Client Server implement javac HelloImpl.java rmic HelloImpl Hello.java implement HelloImpl.java javac HelloImpl.java HelloImpl.class HelloClient.java rmic HelloImpl HelloServer.java generates javac HelloClient.java 전달 javac HelloServer.java Hello.class Hello.class HelloImpl_Stub.class HelloImpl_Stub.class HelloServer.class HelloClient.class HelloImpl.class 전달 Client Server 18

RMI Calculator Example - 1 Numbers.java import java.util.HashMap; import java.io.Serializable; public class Numbers implements Serializable { HashMap numbers; public Numbers(int size) { numbers = new HashMap(size); } public void setNumber(int key, int value) { numbers.put(key, value); public int getNumber(int key) { return (Integer)numbers.get(key); public int size() { return numbers.size(); 19

RMI Calculator Example - 1 Calc.java import java.rmi.*; public interface Calc extends Remote { public int sum(int a,int b) throws RemoteException; public int sumNumbers(Numbers c) throws RemoteException; } CalcImpl.java import java.rmi.*; import java.rmi.server.*; import java.rmi.registry.*; public class CalcImpl extends UnicastRemoteObject implements Calc { CalcImpl() throws RemoteException { super(); } public int sum(int a,int b) throws RemoteException { return a + b; public int sumNumbers(Numbers c) throws RemoteException { int sum = 0; for (int i = 0 ; i < c.size() ; i++) { sum = sum + c.getNumber(i); return sum; 20

RMI Calculator Example - 2 CalcServer.java import java.rmi.*; import java.rmi.server.*; public class CalcServer { public static void main(String args[]) throws Exception { CalcImpl calc = new CalcImpl(); Naming.rebind("//localhost/calc" , calc); System.out.println("Server waiting....."); } D:/webservice/rmi/server>javac Numbers.java D:/webservice/rmi/server>javac Calc.java D:/webservice/rmi/server>javac CalcImpl.java D:/webservice/rmi/server>javac CalcServer.java D:/webservice/rmi/server>rmic CalcImpl rmic를 실행하여 stub 생성 21

RMI Calculator Example - 3 CalcClient.java import java.rmi.*; import java.rmi.server.*; import java.util.Random; public class CalcClient { public static void main(String[] args) throws Exception { int size = 10; Numbers nums = new Numbers(size); Random random = new Random(System.currentTimeMillis()); for (int i = 0 ; i < size ; i++) { nums.setNumber(i, random.nextInt(1000)); } String url = "//localhost/calc"; Calc remoteCalcObject = (Calc)Naming.lookup(url); System.out.println("Got remote object: " + remoteCalcObject); System.out.println(" 1 + 2 = " + remoteCalcObject.sum(1,2) ); System.out.println(" Sum of " + size + " Random Numbers is " + remoteCalcObject.sumNumbers(nums) ); server 폴더에서 다음 파일들을 client 폴더로 복사 : Calc.class, Numbers.class, CalcImpl_Stub.class D:/webservice/rmi/client>javac CalcClient.java 22

RMI Calculator Example - 4 RMI Registry 실행 서버프로그램 실행 클라이언트 프로그램 실행 D:/webservice/rmi/server>rmiregistry D:/webservice/rmi/server>java CalcServer 새로운 cmd 창에서 수행 D:/webservice/rmi/client>java CalcClient 새로운 cmd 창에서 수행 23