Java RMI-빠른 가이드

RMI는 Remote Method Invocation. 한 시스템 (JVM)에 상주하는 객체가 다른 JVM에서 실행중인 객체에 액세스 / 호출 할 수 있도록하는 메커니즘입니다.

RMI는 분산 응용 프로그램을 구축하는 데 사용됩니다. Java 프로그램 간의 원격 통신을 제공합니다. 패키지로 제공됩니다.java.rmi.

RMI 애플리케이션의 아키텍처

RMI 응용 프로그램에서 우리는 두 개의 프로그램을 작성합니다. server program (서버에 있음) 및 client program (클라이언트에 있음).

  • 서버 프로그램 내에서 원격 개체가 생성되고 해당 개체의 참조가 레지스트리를 사용하여 클라이언트에 제공됩니다.

  • 클라이언트 프로그램은 서버의 원격 개체를 요청하고 해당 메서드를 호출하려고합니다.

다음 다이어그램은 RMI 애플리케이션의 아키텍처를 보여줍니다.

이제이 아키텍처의 구성 요소에 대해 설명하겠습니다.

  • Transport Layer−이 계층은 클라이언트와 서버를 연결합니다. 기존 연결을 관리하고 새 연결도 설정합니다.

  • Stub− 스텁은 클라이언트에서 원격 개체의 표현 (프록시)입니다. 클라이언트 시스템에 있습니다. 클라이언트 프로그램의 게이트웨이 역할을합니다.

  • Skeleton − 이것은 서버 측에 상주하는 개체입니다. stub 이 스켈레톤과 통신하여 원격 객체에 요청을 전달합니다.

  • RRL(Remote Reference Layer) − 클라이언트가 원격 객체에 대한 참조를 관리하는 계층입니다.

RMI 응용 프로그램 작업

다음 사항은 RMI 응용 프로그램의 작동 방식을 요약합니다.

  • 클라이언트가 원격 객체를 호출 할 때 스텁이 수신하여 결국이 요청을 RRL로 전달합니다.

  • 클라이언트 측 RRL이 요청을 수신하면 다음과 같은 메소드를 호출합니다. invoke() 개체의 remoteRef. 요청을 서버 측의 RRL로 전달합니다.

  • 서버 측의 RRL은 요청을 스켈레톤 (서버의 프록시)으로 전달하여 최종적으로 서버에서 필요한 객체를 호출합니다.

  • 결과는 클라이언트로 다시 전달됩니다.

마샬링 및 비 마샬링

클라이언트가 원격 개체의 매개 변수를 받아들이는 메서드를 호출 할 때마다 매개 변수는 네트워크를 통해 전송되기 전에 메시지에 번들로 제공됩니다. 이러한 매개 변수는 기본 유형 또는 객체 일 수 있습니다. 기본 유형의 경우 매개 변수가 합쳐지고 헤더가 첨부됩니다. 매개 변수가 객체 인 경우 직렬화됩니다. 이 프로세스는marshalling.

서버 측에서 패킹 된 매개 변수가 번들 해제 된 다음 필요한 메소드가 호출됩니다. 이 프로세스는unmarshalling.

RMI 레지스트리

RMI 레지스트리는 모든 서버 개체가 배치되는 네임 스페이스입니다. 서버가 객체를 생성 할 때마다이 객체를 RMIregistry에 등록합니다 (사용bind() 또는 reBind()행동 양식). 이들은 다음과 같은 고유 한 이름을 사용하여 등록됩니다.bind name.

원격 개체를 호출하려면 클라이언트에 해당 개체의 참조가 필요합니다. 이때 클라이언트는 바인드 이름을 사용하여 레지스트리에서 개체를 가져옵니다 (사용lookup() 방법).

다음 그림은 전체 프로세스를 설명합니다.

RMI의 목표

다음은 RMI의 목표입니다-

  • 응용 프로그램의 복잡성을 최소화합니다.
  • 형식 안전성을 유지합니다.
  • 분산 가비지 수집.
  • 로컬 개체와 원격 개체 작업의 차이를 최소화합니다.

RMI Java 애플리케이션을 작성하려면 아래 단계를 따라야합니다.

  • 원격 인터페이스 정의
  • 구현 클래스 (원격 객체) 개발
  • 서버 프로그램 개발
  • 클라이언트 프로그램 개발
  • 애플리케이션 컴파일
  • 응용 프로그램 실행

원격 인터페이스 정의

원격 인터페이스는 특정 원격 개체의 모든 메서드에 대한 설명을 제공합니다. 클라이언트는이 원격 인터페이스와 통신합니다.

원격 인터페이스를 생성하려면-

  • 미리 정의 된 인터페이스를 확장하는 인터페이스 만들기 Remote 패키지에 속합니다.

  • 이 인터페이스에서 클라이언트가 호출 할 수있는 모든 비즈니스 메소드를 선언하십시오.

  • 원격 호출 중에 네트워크 문제가 발생할 가능성이 있으므로 RemoteException발생할 수 있습니다; 던져.

다음은 원격 인터페이스의 예입니다. 여기에서 이름을 가진 인터페이스를 정의했습니다.Hello 그리고 그것은 printMsg().

import java.rmi.Remote; 
import java.rmi.RemoteException;  

// Creating Remote interface for our application 
public interface Hello extends Remote {  
   void printMsg() throws RemoteException;  
}

구현 클래스 (원격 개체) 개발

이전 단계에서 만든 원격 인터페이스를 구현해야합니다. (구현 클래스를 별도로 작성하거나 서버 프로그램이이 인터페이스를 직접 구현하도록 만들 수 있습니다.)

구현 클래스를 개발하려면-

  • 이전 단계에서 만든 인터페이스를 구현합니다.
  • 원격 인터페이스의 모든 추상 메서드에 대한 구현을 제공합니다.

다음은 구현 클래스입니다. 여기에서 우리는ImplExample 인터페이스를 구현했습니다. Hello 이전 단계에서 생성하여 제공 body 메시지를 인쇄하는이 메소드에 대해.

// Implementing the remote interface 
public class ImplExample implements Hello {  
   
   // Implementing the interface method 
   public void printMsg() {  
      System.out.println("This is an example RMI program");  
   }  
}

서버 프로그램 개발

RMI 서버 프로그램은 원격 인터페이스를 구현하거나 구현 클래스를 확장해야합니다. 여기에서 원격 객체를 생성하고RMIregistry.

서버 프로그램을 개발하려면-

  • 원격 개체를 호출하려는 위치에서 클라이언트 클래스를 만듭니다.

  • Create a remote object 아래와 같이 구현 클래스를 인스턴스화합니다.

  • 방법을 사용하여 원격 개체 내보내기 exportObject() 명명 된 클래스의 UnicastRemoteObject 패키지에 속하는 java.rmi.server.

  • 다음을 사용하여 RMI 레지스트리를 가져옵니다. getRegistry() 의 방법 LocateRegistry 패키지에 속하는 클래스 java.rmi.registry.

  • 다음을 사용하여 생성 된 원격 개체를 레지스트리에 바인딩합니다. bind() 명명 된 클래스의 메서드 Registry. 이 메서드에 바인딩 이름과 내 보낸 개체를 나타내는 문자열을 매개 변수로 전달합니다.

다음은 RMI 서버 프로그램의 예입니다.

import java.rmi.registry.Registry; 
import java.rmi.registry.LocateRegistry; 
import java.rmi.RemoteException; 
import java.rmi.server.UnicastRemoteObject; 

public class Server extends ImplExample { 
   public Server() {} 
   public static void main(String args[]) { 
      try { 
         // Instantiating the implementation class 
         ImplExample obj = new ImplExample(); 
    
         // Exporting the object of implementation class  
         // (here we are exporting the remote object to the stub) 
         Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0);  
         
         // Binding the remote object (stub) in the registry 
         Registry registry = LocateRegistry.getRegistry(); 
         
         registry.bind("Hello", stub);  
         System.err.println("Server ready"); 
      } catch (Exception e) { 
         System.err.println("Server exception: " + e.toString()); 
         e.printStackTrace(); 
      } 
   } 
}

클라이언트 프로그램 개발

클라이언트 프로그램을 작성하고 원격 개체를 가져와이 개체를 사용하여 필요한 메서드를 호출합니다.

클라이언트 프로그램을 개발하려면-

  • 원격 개체를 호출하려는 위치에서 클라이언트 클래스를 만듭니다.

  • 다음을 사용하여 RMI 레지스트리를 가져옵니다. getRegistry() 의 방법 LocateRegistry 패키지에 속하는 클래스 java.rmi.registry.

  • 방법을 사용하여 레지스트리에서 개체를 가져옵니다. lookup() 수업의 Registry 패키지에 속하는 java.rmi.registry.

    이 메서드에는 바인딩 이름을 나타내는 문자열 값을 매개 변수로 전달해야합니다. 그러면 원격 개체가 반환됩니다.

  • lookup ()은 remote 유형의 객체를 반환하고 Hello 유형으로 다운 캐스트합니다.

  • 마지막으로 얻은 원격 개체를 사용하여 필요한 메서드를 호출합니다.

다음은 RMI 클라이언트 프로그램의 예입니다.

import java.rmi.registry.LocateRegistry; 
import java.rmi.registry.Registry;  

public class Client {  
   private Client() {}  
   public static void main(String[] args) {  
      try {  
         // Getting the registry 
         Registry registry = LocateRegistry.getRegistry(null); 
    
         // Looking up the registry for the remote object 
         Hello stub = (Hello) registry.lookup("Hello"); 
    
         // Calling the remote method using the obtained object 
         stub.printMsg(); 
         
         // System.out.println("Remote method invoked"); 
      } catch (Exception e) {
         System.err.println("Client exception: " + e.toString()); 
         e.printStackTrace(); 
      } 
   } 
}

응용 프로그램 컴파일

응용 프로그램을 컴파일하려면-

  • 원격 인터페이스를 컴파일하십시오.
  • 구현 클래스를 컴파일하십시오.
  • 서버 프로그램을 컴파일하십시오.
  • 클라이언트 프로그램을 컴파일하십시오.

또는,

모든 프로그램을 저장 한 폴더를 열고 아래와 같이 모든 Java 파일을 컴파일합니다.

Javac *.java

응용 프로그램 실행

Step 1 − 시작 rmi 다음 명령을 사용하여 레지스트리.

start rmiregistry

이것은 시작됩니다 rmi 아래에 표시된대로 별도의 창에 레지스트리.

Step 2 − 아래와 같이 서버 클래스 파일을 실행합니다.

Java Server

Step 3 − 아래와 같이 클라이언트 클래스 파일을 실행합니다.

java Client

Verification − 클라이언트를 시작하자마자 서버에 다음 출력이 표시됩니다.

이전 장에서 샘플 RMI 애플리케이션을 만들었습니다. 이 장에서는 클라이언트가 GUI 창 (JavaFX)을 표시하는 메서드를 호출하는 RMI 응용 프로그램을 만드는 방법을 설명합니다.

원격 인터페이스 정의

여기에서 이름이 지정된 원격 인터페이스를 정의합니다. Hello 명명 된 방법으로 animation() 그것에.

import java.rmi.Remote; 
import java.rmi.RemoteException;  

// Creating Remote interface for our application 
public interface Hello extends Remote { 
   void animation() throws RemoteException; 
}

구현 클래스 개발

이 애플리케이션의 구현 클래스 (원격 개체)에서 JavaFX를 사용하여 GUI 콘텐츠를 표시하는 창을 만들려고합니다.

import javafx.animation.RotateTransition;  
import javafx.application.Application;  
import javafx.event.EventHandler;   

import javafx.scene.Group;  
import javafx.scene.PerspectiveCamera;  
import javafx.scene.Scene;  
import javafx.scene.control.TextField;  
import javafx.scene.input.KeyEvent;  
import javafx.scene.paint.Color;  
import javafx.scene.paint.PhongMaterial; 
  
import javafx.scene.shape.Box;  
import javafx.scene.text.Font;  
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;   
import javafx.scene.transform.Rotate;  

import javafx.stage.Stage;  
import javafx.util.Duration;  

// Implementing the remote interface 
public class FxSample extends Application implements Hello {  
   @Override  
   public void start(Stage stage) { 
      // Drawing a Box  
      Box box = new Box();  

      // Setting the properties of the Box  
      box.setWidth(150.0);  
      box.setHeight(150.0);    
      box.setDepth(100.0);  

      // Setting the position of the box  
      box.setTranslateX(350);   
      box.setTranslateY(150);  
      box.setTranslateZ(50);  

      // Setting the text  
      Text text = new Text(
         "Type any letter to rotate the box, and click on the box to stop the rotation");

      // Setting the font of the text  
      text.setFont(Font.font(null, FontWeight.BOLD, 15));      

      // Setting the color of the text  
      text.setFill(Color.CRIMSON);  

      // Setting the position of the text  
      text.setX(20);  
      text.setY(50); 

      // Setting the material of the box  
      PhongMaterial material = new PhongMaterial();   
      material.setDiffuseColor(Color.DARKSLATEBLUE);   

      // Setting the diffuse color material to box  
      box.setMaterial(material);        

      // Setting the rotation animation to the box     
      RotateTransition rotateTransition = new RotateTransition();  

      // Setting the duration for the transition  
      rotateTransition.setDuration(Duration.millis(1000));  

      // Setting the node for the transition  
      rotateTransition.setNode(box);        

      // Setting the axis of the rotation  
      rotateTransition.setAxis(Rotate.Y_AXIS);  

      // Setting the angle of the rotation 
      rotateTransition.setByAngle(360);  

      // Setting the cycle count for the transition  
      rotateTransition.setCycleCount(50);  

      // Setting auto reverse value to false  
      rotateTransition.setAutoReverse(false);   

      // Creating a text filed  
      TextField textField = new TextField();    

      // Setting the position of the text field  
      textField.setLayoutX(50);  
      textField.setLayoutY(100);  

      // Handling the key typed event  
      EventHandler<KeyEvent> eventHandlerTextField = new EventHandler<KeyEvent>() {  
         @Override  
         public void handle(KeyEvent event) {  
            // Playing the animation  
            rotateTransition.play();  
         }            
      };               
      
      // Adding an event handler to the text feld  
      textField.addEventHandler(KeyEvent.KEY_TYPED, eventHandlerTextField);  

      // Handling the mouse clicked event(on box)  
      EventHandler<javafx.scene.input.MouseEvent> eventHandlerBox =  
         new EventHandler<javafx.scene.input.MouseEvent>() {  
         @Override  
         public void handle(javafx.scene.input.MouseEvent e) {  
            rotateTransition.stop();   
         }  
      };  
      
      // Adding the event handler to the box   
      box.addEventHandler(javafx.scene.input.MouseEvent.MOUSE_CLICKED, eventHandlerBox); 

      // Creating a Group object 
      Group root = new Group(box, textField, text);  

      // Creating a scene object  
      Scene scene = new Scene(root, 600, 300);       

      // Setting camera  
      PerspectiveCamera camera = new PerspectiveCamera(false);  
      camera.setTranslateX(0);  
      camera.setTranslateY(0);  
      camera.setTranslateZ(0);  
      scene.setCamera(camera);   

      // Setting title to the Stage
      stage.setTitle("Event Handlers Example");  

      // Adding scene to the stage  
      stage.setScene(scene);  

      // Displaying the contents of the stage  
      stage.show();  
   }  

   // Implementing the interface method 
   public void animation() {  
      launch();  
   }  
}

서버 프로그램

RMI 서버 프로그램은 원격 인터페이스를 구현하거나 구현 클래스를 확장해야합니다. 여기에서 원격 객체를 생성하고RMIregistry.

다음은이 응용 프로그램의 서버 프로그램입니다. 여기서는 위에서 생성 한 클래스를 확장하고 원격 객체를 생성 한 다음 바인드 이름으로 RMI 레지스트리에 등록합니다.hello.

import java.rmi.registry.Registry; 
import java.rmi.registry.LocateRegistry; 
import java.rmi.RemoteException; 
import java.rmi.server.UnicastRemoteObject; 

public class Server extends FxSample { 
   public Server() {} 
   public static void main(String args[]) { 
      try { 
         // Instantiating the implementation class 
         FxSample obj = new FxSample();
      
         // Exporting the object of implementation class  
         // (here we are exporting the remote object to the stub) 
         Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0);  
      
         // Binding the remote object (stub) in the registry 
         Registry registry = LocateRegistry.getRegistry(); 
         
         registry.bind("Hello", stub);  
         System.err.println("Server ready"); 
      } catch (Exception e) { 
         System.err.println("Server exception: " + e.toString()); 
         e.printStackTrace(); 
      } 
   } 
}

클라이언트 프로그램

다음은이 응용 프로그램의 클라이언트 프로그램입니다. 여기에서 원격 객체를 가져 와서 다음과 같은 메서드를 호출합니다.animation().

import java.rmi.registry.LocateRegistry; 
import java.rmi.registry.Registry;  

public class Client { 
   private Client() {} 
   public static void main(String[] args) {  
      try { 
         // Getting the registry 
         Registry registry = LocateRegistry.getRegistry(null); 
    
         // Looking up the registry for the remote object 
         Hello stub = (Hello) registry.lookup("Hello"); 
         
         // Calling the remote method using the obtained object 
         stub.animation(); 
         
         System.out.println("Remote method invoked"); 
      } catch (Exception e) {
         System.err.println("Client exception: " + e.toString()); 
         e.printStackTrace(); 
      } 
   } 
}

예제 실행 단계

다음은 RMI 예제를 실행하는 단계입니다.

Step 1 − 모든 프로그램이 저장된 폴더를 열고 아래와 같이 모든 Java 파일을 컴파일합니다.

Javac *.java

Step 2 − 시작 rmi 다음 명령을 사용하여 레지스트리.

start rmiregistry

이것은 시작됩니다 rmi 아래에 표시된대로 별도의 창에 레지스트리.

Step 3 − 아래와 같이 서버 클래스 파일을 실행합니다.

Java Server

Step 4 − 아래와 같이 클라이언트 클래스 파일을 실행합니다.

java Client

Verification − 클라이언트를 시작하자마자 서버에 다음 출력이 표시됩니다.

이전 장에서 클라이언트가 GUI 창 (JavaFX)을 표시하는 메소드를 호출하는 샘플 RMI 애플리케이션을 만들었습니다.

이 장에서는 클라이언트 프로그램이 서버에있는 MySQL 데이터베이스의 테이블 레코드를 검색 할 수있는 방법에 대한 예제를 살펴 보겠습니다.

다음과 같은 테이블이 있다고 가정합니다. student_data 데이터베이스에서 details 아래 그림과 같이.

+----+--------+--------+------------+---------------------+ 
| ID | NAME   | BRANCH | PERCENTAGE | EMAIL               | 
+----+--------+--------+------------+---------------------+ 
|  1 | Ram    | IT     |         85 | [email protected]    | 
|  2 | Rahim  | EEE    |         95 | [email protected]  | 
|  3 | Robert | ECE    |         90 | [email protected] | 
+----+--------+--------+------------+---------------------+

사용자의 이름이 myuser 암호는 password.

학생 수업 만들기

만들기 Student 수업 settergetter 아래와 같이 방법.

public class Student implements java.io.Serializable {   
   private int id, percent;   
   private String name, branch, email;    
  
   public int getId() { 
      return id; 
   } 
   public String getName() { 
      return name; 
   } 
   public String getBranch() { 
      return branch; 
   } 
   public int getPercent() { 
      return percent; 
   } 
   public String getEmail() { 
      return email; 
   } 
   public void setID(int id) { 
      this.id = id; 
   } 
   public void setName(String name) { 
      this.name = name; 
   } 
   public void setBranch(String branch) { 
      this.branch = branch; 
   } 
   public void setPercent(int percent) { 
      this.percent = percent; 
   } 
   public void setEmail(String email) { 
      this.email = email; 
   } 
}

원격 인터페이스 정의

원격 인터페이스를 정의하십시오. 여기에서 이름이 지정된 원격 인터페이스를 정의합니다.Hello 명명 된 방법으로 getStudents ()그것에. 이 메소드는 클래스의 객체를 포함하는 목록을 반환합니다.Student.

import java.rmi.Remote; 
import java.rmi.RemoteException; 
import java.util.*;

// Creating Remote interface for our application 
public interface Hello extends Remote {  
   public List<Student> getStudents() throws Exception;  
}

구현 클래스 개발

클래스를 만들고 위에서 만든 구현 interface.

여기에서 우리는 getStudents() 의 방법 Remote interface. 이 메소드를 호출하면 다음과 같은 테이블의 레코드를 검색합니다.student_data. setter 메서드를 사용하여 이러한 값을 Student 클래스에 설정하고 목록 개체에 추가 한 다음 해당 목록을 반환합니다.

import java.sql.*; 
import java.util.*;  

// Implementing the remote interface 
public class ImplExample implements Hello {  
   
   // Implementing the interface method 
   public List<Student> getStudents() throws Exception {  
      List<Student> list = new ArrayList<Student>();   
    
      // JDBC driver name and database URL 
      String JDBC_DRIVER = "com.mysql.jdbc.Driver";   
      String DB_URL = "jdbc:mysql://localhost:3306/details";  
      
      // Database credentials 
      String USER = "myuser"; 
      String PASS = "password";  
      
      Connection conn = null; 
      Statement stmt = null;  
      
      //Register JDBC driver 
      Class.forName("com.mysql.jdbc.Driver");   
      
      //Open a connection
      System.out.println("Connecting to a selected database..."); 
      conn = DriverManager.getConnection(DB_URL, USER, PASS); 
      System.out.println("Connected database successfully...");  
      
      //Execute a query 
      System.out.println("Creating statement..."); 
      
      stmt = conn.createStatement();  
      String sql = "SELECT * FROM student_data"; 
      ResultSet rs = stmt.executeQuery(sql);  
      
      //Extract data from result set 
      while(rs.next()) { 
         // Retrieve by column name 
         int id  = rs.getInt("id"); 
         
         String name = rs.getString("name"); 
         String branch = rs.getString("branch"); 
         
         int percent = rs.getInt("percentage"); 
         String email = rs.getString("email");  
         
         // Setting the values 
         Student student = new Student(); 
         student.setID(id); 
         student.setName(name); 
         student.setBranch(branch); 
         student.setPercent(percent); 
         student.setEmail(email); 
         list.add(student); 
      } 
      rs.close(); 
      return list;     
   }  
}

서버 프로그램

RMI 서버 프로그램은 원격 인터페이스를 구현하거나 구현 클래스를 확장해야합니다. 여기에서 원격 객체를 생성하고RMI registry.

다음은이 응용 프로그램의 서버 프로그램입니다. 여기서는 위에서 생성 한 클래스를 확장하고 원격 객체를 생성 한 다음 바인드 이름으로 RMI 레지스트리에 등록합니다.hello.

import java.rmi.registry.Registry; 
import java.rmi.registry.LocateRegistry; 
import java.rmi.RemoteException; 
import java.rmi.server.UnicastRemoteObject; 

public class Server extends ImplExample { 
   public Server() {} 
   public static void main(String args[]) { 
      try { 
         // Instantiating the implementation class 
         ImplExample obj = new ImplExample(); 
    
         // Exporting the object of implementation class (
            here we are exporting the remote object to the stub) 
         Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0);  
         
         // Binding the remote object (stub) in the registry 
         Registry registry = LocateRegistry.getRegistry(); 
         
         registry.bind("Hello", stub);  
         System.err.println("Server ready"); 
      } catch (Exception e) { 
         System.err.println("Server exception: " + e.toString()); 
         e.printStackTrace(); 
      } 
   } 
}

클라이언트 프로그램

다음은이 응용 프로그램의 클라이언트 프로그램입니다. 여기서 우리는 원격 객체를 가져오고 이름이 지정된 메소드를 호출합니다.getStudents(). 목록 개체에서 테이블의 레코드를 검색하여 표시합니다.

import java.rmi.registry.LocateRegistry; 
import java.rmi.registry.Registry; 
import java.util.*;  

public class Client {  
   private Client() {}  
   public static void main(String[] args)throws Exception {  
      try { 
         // Getting the registry 
         Registry registry = LocateRegistry.getRegistry(null); 
    
         // Looking up the registry for the remote object 
         Hello stub = (Hello) registry.lookup("Hello"); 
    
         // Calling the remote method using the obtained object 
         List<Student> list = (List)stub.getStudents(); 
         for (Student s:list)v { 
            
            // System.out.println("bc "+s.getBranch()); 
            System.out.println("ID: " + s.getId()); 
            System.out.println("name: " + s.getName()); 
            System.out.println("branch: " + s.getBranch()); 
            System.out.println("percent: " + s.getPercent()); 
            System.out.println("email: " + s.getEmail()); 
         }  
      // System.out.println(list); 
      } catch (Exception e) { 
         System.err.println("Client exception: " + e.toString()); 
         e.printStackTrace(); 
      } 
   } 
}

예제 실행 단계

다음은 RMI 예제를 실행하는 단계입니다.

Step 1 − 모든 프로그램이 저장된 폴더를 열고 아래와 같이 모든 Java 파일을 컴파일합니다.

Javac *.java

Step 2 − 시작 rmi 다음 명령을 사용하여 레지스트리.

start rmiregistry

이것은 시작됩니다 rmi 아래에 표시된대로 별도의 창에 레지스트리.

Step 3 − 아래와 같이 서버 클래스 파일을 실행합니다.

Java Server

Step 4 − 아래와 같이 클라이언트 클래스 파일을 실행합니다.

java Client