Presentation is loading. Please wait.

Presentation is loading. Please wait.

제14장 원격 메소드 호출 김 기 환. 조 명 휘.

Similar presentations


Presentation on theme: "제14장 원격 메소드 호출 김 기 환. 조 명 휘."— Presentation transcript:

1 제14장 원격 메소드 호출 김 기 환. 조 명 휘

2 목 차 원격 메소드 호출 구현하기 java.rmi 패키지 java.rmi.registry 패키지
java.rmi.server 패키지 System Software Lab.

3 원격 메소드 호출이란? 네트워킹과 애플리케이션의 개발
> 데이터와 호스트 사이의 파일 이동 (FTP, SMTP, HTTP, NFS) > 하나의 호스트에서 다른 호스트의 프로그램을 실행 (Telnet, rlogin, RPC, 데이터베이스미들웨어) System Software Lab.

4 원격 메소드 호출이란?(계속) RMI(Remote Method Invocation) 자바 프로그램이 원격 서버에 있는 메소드를 호출할 수 있도록 해주는 기능 호스트가 TCP/IP를 사용가능하면 스트림이나 소켓의 사용없이 네트워크 기반 애플리케이션 개발 가능 System Software Lab.

5 원격 메소드 호출이란?(계속) RMI(Remote Method Invocation) JVM 1 JVM 2 Remote
RemoteObject method() method() Internet System Software Lab.

6 보안 애플릿의 활동이 제한되는 것과 같은 방식으로 원격 객체의 활동 제한.
SecurityManager 객체는 원격 객체의 활동이 서버에 의해 허락되었는지 체크 System Software Lab.

7 객체 직렬화(serialization)
두기계 사이에서의 객체 전달 > 객체에 대한 특별한 원격 지시자 전달 > 객체의 복사본을 전달 객체의 복사 > 객체 직렬화를 통해 바이트스트림으로 변환하여 전달 한다. System Software Lab.

8 객체 직렬화(serialization)(계속)
직렬화 가능한 객체 > 기본 자료형, 원격 객체 > 비원격 객체는 java.io.Serializable 인터페이스 구현시 > 직렬화 가능한 클래스 (P.421) System Software Lab.

9 장막 뒤 기본자료형(int, boolean, double등) - 로컬 자바 메소드 호출 경우처럼 값으로 전달한다.
원격 객체에 대한 지시자(Remote 인터페이스를 구현한 객체) - 원격 지시자로 전달 Remote 인터페이스를 구현하지 않은 객체 - 값으로 전달(객체 직렬화를 이용 완전한 복사본의 전달) System Software Lab.

10 장막 뒤 (계속) 스텁 : 원격에 있는 객체의 메소드를 호출할때 필요한 설정과 매개변수들을 전송할 수 있도록 자동으로 변환
스켈레톤 : 네트워크를 통해 요청을 받고, 그것을 실제 객체상의 메소드 호출로 변환해주는 작업 System Software Lab.

11 장막 뒤 (계속) 서버 프로그램 클라이언트 프로그램 스켈레톤 스텝 원격 지시자 계층 원격 지시자 계층 전송 계층 인터넷
논리적경로 서버 프로그램 클라이언트 프로그램 스켈레톤 스텝 원격 지시자 계층 원격 지시자 계층 전송 계층 인터넷 전송 계층 RMI 계층 모델 System Software Lab.

12 구현 원격 객체 사용시 필요한 패키지 - java.rmi : 클라이언트쪽에서 보여지는 클래스, 인터페이스, 예외 정의 - java.rmi.server : 서버쪽에서 보여지는(원격 객체 작성시) 클래스, 인터 인터페이스, 예외 정의 - java.rmi.registry : 원격 객체를 찾고 이름을 부여 - java.rmi.dgc : 분산 가비지 콜렉션을 담당 System Software Lab.

13 구현 (계속) 서버 쪽 - 원격 객체를 위한 인터페이스 정의 > Hello 인터페이스 import java.rmi.*; pubic interface Hello extends Remote { pubic String sayHello() throws java.rmi.RemoteException; } System Software Lab.

14 구현 (계속) 서버 쪽 (계속) -원격 인터페이스를 구현하는 클래스 정의 2018-10-13
System Software Lab.

15 구현 (계속) > HelloImpl 클래스
public class HelloImpl extends UnicastRemoteObject implements Hello { public HelloImpl() throws RemoteException { super(); } public String sayHello() throws RemoteException { return "Hello, World!"; public static void main(String args[]) { try { HelloImpl h = new HelloImpl(); Naming.rebind("hello", h); System.out.println("Hello Server ready."); System Software Lab.

16 구현 (계속) > 스텁과 스켈레톤의 생성 - rmic는 원격 객체의 .class파일을 읽어 스텁과 스켈레톤을 만든다. %rmic HelloImpl HelloImpl_Skel.class HelloImpl_Stub.class System Software Lab.

17 구현 (계속) > rmic 옵션 - 클래스 파일의 위치 지정
rmic –classpath test/class HelloImpl - 컴파일된 .class 파일의 저장 위치 지정 rmic HelloImpl –d –classpath test/classes System Software Lab.

18 구현 (계속) > 레지스트리 시작 레지스트리는 기본적으로 1099포트를 통해서 신호를 기다린다. - 유닉스 %rmiregistry & - DOS c:\start rmiregistry System Software Lab.

19 구현 (계속) > 1099포트가 사용중일 경우 - 레지스트리를 가리키는 URL에 포트 번호 명시 %rmiregistry 2048 & System Software Lab.

20 구현 (계속) > 서버 시동 %java HelloImpl & Hello Server ready. 서버와 레지스트리는 원격 메소드의 호출을 받을 준비 완료. System Software Lab.

21 구현 (계속) 클라이언트 쪽 > Hello 클라이언트 import java.rmi.*;
public class HelloClient { public static void main(String args[]) { // System.setSecurityManager(new RMISecurityManager()); try { Hello h = (Hello) Naming.lookup("hello"); String message = h.sayHello(); System.out.println("HelloClient: " + message); } catch (Exception e) { System.out.println("Exception in main: " + e); Hello h = (Hello) Naming.lookup(“rmi://syssw.hannam.ac.kr/hello"); System Software Lab.

22 구현 (계속) 서버 클라이언트 [레지스트리에게 대화하는 클라이언트] 스텁 lookup() : Hello가 어디에 있나?
이곳에 있다. HelloImpl_Stub.class 스텁을 보내라. 스텁을 받아라. HelloImpl_Skel.class 스텁 sayHello() HelloImpl.class “Hello” [레지스트리에게 대화하는 클라이언트] System Software Lab.

23 java.rmi 패키지 Remote 인터페이스 > 인터페이스 안에 선언된 메소드들은 원격으로 호출될 수 있다.
import java.rmi.*; import java.rmi.server.*; public interface SQL extends Remote { public String[] SQLQuery(String query) throws java.rmi.RemoteException; } System Software Lab.

24 java.rmi 패키지(계속) Namming 클래스 >URL(rmi://sunsite.unc.edu/myRemoteObject) 을 특정한 원격 객체로 매핑 시키는 레지스티리(원격 객체를 위한 DNS) >클라이언트는 URL을 통해 이름을 대고, 원격 객체에 대한 지시자를 받아간다. System Software Lab.

25 java.rmi 패키지(계속) Namming 클래스 형식 rmi://sunsite.unc.edu:2001/myRemoteObject > URL의 마지막 부분은 서버가 특정한 원격 객체에 바인드(BIND)한 임의의 이름, 파일이름이 아니다. System Software Lab.

26 java.rmi 패키지(계속) Namming 클래스 메소드 > bind() > list() > lookup() > rebind() > unbind() System Software Lab.

27 java.rmi 패키지(계속) public static Remote lookup(String url) throws RemoteException” NotBoundException, AccessException, UnknownHostException > URL의 파일 부분에 들어 있는 문자열에 해당하는 Remote 인터페이스를 얻는다. System Software Lab.

28 java.rmi 패키지(계속) public static void bind(String url, Remote ro) throws RemoteException, NotBoundException, AlreadyBoundException” AccessException, UnknownHostException > rmi://sunsite.unc.edu:2001//myRemoteObject myRemoteObject 와 같은 이름을 원격 객체에 연결하기 위해 사용한다. System Software Lab.

29 java.rmi 패키지(계속) public static void unbind(String url) throws RemoteException, NotBoundException, AccessException, UnknownHostException > 레지스트리에 주어진 URL에 해당하는 객체를 제거 public static void rebind(String url, Remote obj) throws RemoteException, NotBoundException, AccessException, UnknownHostException > 이미 bind된 URL을 새로운 URL로 바인드 시킨다. System Software Lab.

30 java.rmi 패키지(계속) public static string[] list(String url) throws RemoteException, NotBoundException, AccessException, UnknownHostException > 현재 바인드된 모든 URL을 문자열 배열로 반환 url인자는 조회하고자 하는 Namming 레지스트리의 URL System Software Lab.

31 java.rmi 패키지(계속) RMISecurityManager 클래스 > 신뢰할 수 없는 서버로 부터 스텁 적재시 자신을 보호하기 위해 사용 > SecurityManager 객체가 없으면 스텁 적재를 허용하지 않는다. > 원격 객체에 접근하고, 인자를 원격 메소드에 전달, 원격 메소드로부터 값을 반환받기 위해 필요한 최소한의 기능만을 허용 System Software Lab.

32 java.rmi 패키지(계속) public RMISecurityManager() > 정적 메소드인 System.setSecurityManager() 메소드 안에서 SecurityManager를 직접 생성 System.setSecurityManager(new RMISecurityManager()); public Object getSecurityContext() > 어떤 작업을 위한 환경을 결정 System Software Lab.

33 java.rmi 패키지(계속) 체크 옵션들 > 다양한 기능들에 대한 허용 여부 조사하는 23개의 메소드 (P.436) 직접 사용하지는 않지만 스텁이 할수 있는일과 없는 일들을 이해하기 위해 알아둘 필요가 있다. 예) checkCreateClassLoader() 스텁은 ClassLoader를 생성할수 있나? System Software Lab.

34 java.rmi 패키지(계속) 원격 예외 > 모든 원격 메소드는 RemoteException을 발생시키는 것으로 선언하고, try-catch 블록안에서 원격 메소드를 호출. (P.438) 예) try { // 원격메소드 호출 } catch (RemoteException e) { System.err.printLN(e); } System Software Lab.

35 java.rmi.registry 패키지 레지스트리 인터페이스 > java.rmi.registry.Registry 인터페이스는 5개의 공용메소드 bind(), list(), lookup(), rebind(), unbind() java.rmi.Namming클래스와 똑같이 작용 > public final static int 로 지정된 필드 REGISTRY_PORT –레지스트리가 신호를 기다리는 기본 포트(현재 1099) System Software Lab.

36 java.rmi.registry 패키지(계속)
RegistryHandler 인터페이스 >registryImpl(int port) 특정한 포트에 대해서 Registry객체를 생성하고 내보낸다. >registryStub(String host, int port) 특정한 호스트의 특정한 포트에서 실행되고 있는 레지스트리와 통신 System Software Lab.

37 java.rmi.registry 패키지(계속)
LocateRegistry 인터페이스 > java.rmi.Registry.LocateRegistry 클래스는 클라이언트가 레지스트리를 한번에 찾을 수 있도록 해준다. System Software Lab.

38 java.rmi.registry 패키지(계속)
LocateRegistry.getRegistry() – 기본포트 번호 1099에서 실행되는 Registry 반환 LocateRegistry. getRegistry(int port) – 지정된 포트에서 실행되는 Registry 반환 LocateRegistry. getRegistry(String host) – 지정된호스트 기본 포트 LocateRegistry. getRegistry(String host, int port) – 지정된호스트의 지정된 포트 System Software Lab.

39 java.rmi.server 패키지 원격 객체를 만들수 있는 발판(클라이언트에 의해서 호출될 메소드를 가지고 있는 객체들이 사용) 모든 원격객체를 위해 기본이 되는 RemoteObject, RemoteServer 클래스와 RemoteServer를 확장한 UnicastRemoteObject 가 중요한 클래스이다. System Software Lab.

40 java.rmi.server 패키지(계속)
RemoteObject 클래스 > toString() – 원격 객체를 묘사하는 String을 반환. >hashCode() – 유일한 int를 유일한 객체에 매핑. >equals() – RemoteObject의 원격 객체 지시자 2개를 비교하여 같은 객체를 가르키면 true 반환 >clone() – 필요할때마다 Cloneable을 구현 System Software Lab.

41 java.rmi.server 패키지(계속)
RemoteServer 클래스 - 서버 구현을 위한 추상 수퍼 클래스 자신만의 RemoteServer를 작성함으로써 UDP, 다중전송 원격 서버등을 추가 할수 있다. > 생성자 protected RemoteServer() protected RemoteServer(RemoteRef r) System Software Lab.

42 java.rmi.server 패키지(계속)
> 클라이언트에 대한 정보 얻기 - 현재 서버와 통신하고 있는 클라이언트를 찾는 2개의 메소드가 있다. getClientHost() : 현재 실행중인 호스트의 이름을 포함하고 있는 String반환 getClietnPort() : 현재 실행중인 메소드를 호출한 클라이언트의 포트 번호를 포함한 int반환 System Software Lab.

43 java.rmi.server 패키지(계속)
> 로깅 - 디버깅 목적으로 원격객체에 대한 호출 내역과 그결과를 볼경우 : Output Stream 객체를 setLog() 메소드에 전달하여 RemoteServer에 대한 로그 생성 예) public static void setLog(Output Stream os) System Software Lab.

44 java.rmi.server 패키지(계속)
UnicastRemoteObject 클래스 - RemoteServer의 서브 클래스 메소드들은 인자의 마셜링 및 언마셜링과 같은 일반적인 원격 객체의 기능을 처리 - UnicastRemoteObject()라는 하나의 생성자를 갖고 있다 : 런타임시 선택된 익명포트에 대해서 UnicastRemoteObject를 생성한다. 예) urs1 = new UnicastRemoteObject(); System Software Lab.

45 java.rmi.server 패키지(계속)
예외 > java.rmi.server 패키지는 6개의 예외(p.446) 예) ExportException : 이미 사용중인 포트를 통해서 원격 객체를 내보내려고 하고 있을 경우 SocketSecurityException : SecurityManager가 요청된 포트를 통해 원격 객체가 지나가는 것을 허용하지 않을 경우 System Software Lab.


Download ppt "제14장 원격 메소드 호출 김 기 환. 조 명 휘."

Similar presentations


Ads by Google