자바 RMI 상세 설명 및 실례 설명

7157 단어 자바RMI
자바 자체 가 RPC 프레임 워 크 인 RMI(즉 RemoteMethodInvoke 원 격 방법 호출)를 제공 합 니 다.인 터 페 이 스 를 원 격 으로 호출 할 때 Remote 를 계승 해 야 합 니 다.Remote 인 터 페 이 스 는 로 컬 가상 컴퓨터 에서 호출 할 수 있 는 인 터 페 이 스 를 표시 하 는 데 사 용 됩 니 다."원 격 인터페이스"(java.rmi.Remote 인터페이스 확장)에서 지정 한 이 방법 들 만 원 격 으로 사용 할 수 있 습 니 다.다음은 간단 한 예 시 를 통 해 RMI 원리 와 개발 절 차 를 설명 합 니 다.
원 격 호출 을 진정 으로 실현 하기 위해 먼저 서버 공학 rmi-server 를 만 듭 니 다.구 조 는 다음 과 같 습 니 다.
 
코드 설명:
1.User.java:원 격 호출 시 pojo 대상 의 전송 에 사용 합 니 다.이 대상 은 Serializable 인 터 페 이 스 를 실현 해 야 합 니 다.그렇지 않 으 면 호출 과정 에서 NotSerializable Exception 이상 을 던 집 니 다.코드 는 다음 과 같 습 니 다.

/**
 *     ,        ,    Serializable  
 * 
 * @author andy
 *
 */
public class User implements Serializable {
  private static final long serialVersionUID = 1L;

  private String name;

  private int age;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }

  @Override
  public String toString() {
    return "name : " + this.name + ", age : " + this.age;
  }
}
2.Hello.java:원 격 인터페이스,이 인 터 페 이 스 는 원 격 인 터 페 이 스 를 계승 해 야 하 며,인터페이스 에 있 는 방법 은 모두 Remote Exception 이상 을 던 져 야 합 니 다.코드 는 다음 과 같 습 니 다.

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

import pers.andy.rmi.bean.User;

/**
 *         ,    Remote  ,               RemoteException  
 * 
 * @author andy
 *
 */
public interface IHello extends Remote {

  /**
   *   user  
   * @param user
   * @return
   * @throws RemoteException
   */
  public User updateUser(User user) throws RemoteException;
}
3.HelloImpl:원 격 인터페이스 구현 클래스 는 유 니 캐 스 트 RemoteObject(RemoteServer 계승->RemoteObject 계승->Remote 실현,Serializable)를 계승 해 야 합 니 다.유 니 캐 스 트 RemoteObject 클래스 를 계승 해 야 원 격 대상 이 될 수 있 음 을 나타 내 고 레 지 스 트 에 등록 되 어 사용자 측 원 격 호출(추가:클 라 이언 트 lookup 에서 찾 은 대상,다만 이 원 격 대상 의 Stub(존 근 대상)이 고 서버 의 대상 은 해당 하 는 골조 Skeleton(클 라 이언 트 stub 의 요청 을 받 고 실제 대상 을 호출 하 는 데 사용)이 대응 합 니 다.Stub 는 원 격 대상 의 클 라 이언 트 대리 이 고 Skeleton 은 원 격 대상 의 서비스 단 대리 입 니 다.그들 간 의 협력 은 클 라 이언 트 와 서버 간 의 방법 호출 시의 통신 을 완성 합 니 다.)코드 는 다음 과 같 습 니 다:

/**
 *         ,   UnicastRemoteObject,            
 * 
 * @author andy
 *
 */
public class HelloImpl extends UnicastRemoteObject implements IHello {
  /**
   * 
   */
  private static final long serialVersionUID = 1L;

  /**
   *   UnicastRemoteObject        RemoteException  ,              ,      RemoteException  
   * 
   * @throws RemoteException
   */
  public HelloImpl() throws RemoteException {
  }

  public User updateUser(User user) throws RemoteException {
    System.out.println("--------------       user " + user.toString());
    user.setName("andy2");
    user.setAge(30);
    return user;
  }
}
4.HelloServer:서버 시작 클래스 는 원 격 대상 등록 표를 만 들 고 원 격 대상 을 등록 하 는 데 사 용 됩 니 다.코드 는 다음 과 같 습 니 다.

/**
 *       
 * 
 * @author andy
 *
 */
public class HelloServer {
  public static void main(String args[]) {
    try {
       //              Registry   ,      8888,       (Java     1099)
      LocateRegistry.createRegistry(8888);
      //         RMI      ,    RHello
      //    URL     :rmi://host:port/name(         ,           )
      Naming.bind("rmi://localhost:8888/RHello", rhello);
      // Naming.bind("//localhost:8888/RHello",rhello);
      System.out.println("------------    IHello    ,       ...");
    } catch (RemoteException e) {
      System.out.println("          !");
      e.printStackTrace();
    } catch (AlreadyBoundException e) {
      System.out.println("          !");
      e.printStackTrace();
    } catch (MalformedURLException e) {
      System.out.println("  URL    !");
      e.printStackTrace();
    }
  }
}
추가 설명:왜 HelloImpl 이 유 니 캐 스 트 RemoteObject 를 계승 하면 원 격 대상 으로 발 표 될 수 있 는 지,유 니 캐 스 트 RemoteObject 의 원본 코드 를 찾 아 보면 알 수 있 습 니 다.

protected UnicastRemoteObject() throws RemoteException
  {
    this(0);
  }
  protected UnicastRemoteObject(int port) throws RemoteException
  {
    this.port = port;
    exportObject((Remote) this, port);
  }
사실 server 엔 드 를 시작 할 때 new 는 HelloImpl 대상 이 되 었 습 니 다.유 니 캐 스 트 RemoteObject 를 계 승 했 기 때문에 부모 클래스 의 구조 방법 을 먼저 호출 합 니 다.이 럴 때 this(현재 대상)를 exportObject 방법 으로 등록 합 니 다.
따라서 내 보 낸 대상 에 다른 클래스 를 계승 해 야 한다 면 유 니 캐 스 트 RemoteObject 를 통합 하지 않 고 exportObject 방법 으로 원 격 대상 으로 내 보 낼 수 있 습 니 다.

...
//         
IHello rhello = new HelloImpl();
//HelloImpl     UnicastRemoteObject ,  exportObject      
UnicastRemoteObject.exportObject(rhello,0);
...
이상 은 서버 의 모든 코드 입 니 다.다음은 클 라 이언 트 프로젝트 를 만 드 는 것 입 니 다.구 조 는 다음 과 같 습 니 다.

실제 응용 개발 에서 클 라 이언 트 의 User.java 와 IHello.java 는 서버 에서 jar 패 키 지 를 내 보 내 는 형식 으로 의존 라 이브 러 리 에 추가 해 야 합 니 다.따라서 여 기 는 Hello Client.java 만 소개 합 니 다.이 종 류 는 클 라 이언 트 시작 클래스 입 니 다.레 지 스 트 에서 원 격 대상 을 찾 아 원 격 으로 호출 하 는 데 사 용 됩 니 다.코드 는 다음 과 같 습 니 다.

/**
 *       
 * 
 * @author andy
 *
 */
public class HelloClient {
  public static void main(String args[]) {
    try {
      //  RMI           RHello   ,        
      IHello rhello = (IHello) Naming.lookup("rmi://localhost:8888/RHello");       //   user  ,        
      User user = new User();
      user.setAge(20);
      user.setName("andy");
      System.out.println("--------------        user " + rhello.updateUser(user).toString());
    } catch (NotBoundException e) {
      e.printStackTrace();
    } catch (MalformedURLException e) {
      e.printStackTrace();
    } catch (RemoteException e) {
      e.printStackTrace();
    }
  }
}
지금까지 클 라 이언 트 와 서버 의 공사 가 모두 완료 되 었 습 니 다.지금 은 테스트 를 할 수 있 습 니 다.실행 순서 와 테스트 결 과 는 다음 과 같 습 니 다.
1.먼저 서버 시작 클래스 HelloServer 를 실행 합 니 다.결 과 는 다음 과 같 습 니 다.
서버:원 격 대상 IHello 등록 성공,클 라 이언 트 호출 대기...
2.클 라 이언 트 시작 클래스 를 실행 합 니 다.결 과 는 다음 과 같 습 니 다.
서버:클 라 이언 트 가 보 낸 user 는 name:andy,age:20 입 니 다.
       클 라 이언 트:----------서버 에서 돌아 오 는 user 는 name:andy 2,age:30 입 니 다.
자바 RMI 에 대한 상세 한 소개 및 실례 설명 이 담 긴 이 글 은 여기까지 입 니 다.자바 RMI 에 관 한 더 많은 내용 은 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 읽 어 주시 기 바 랍 니 다.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기