RMI 소예 1개

7784 단어 rmi
정상적으로 작동하는 RMI 시스템은 다음 섹션으로 구성됩니다.
· 원격 서비스의 인터페이스 정의
· 원격서비스 인터페이스의 구체적인 실현
· 말뚝(Stub) 및 프레임(Skeleton) 파일(JDK1.5 이후 자동 생성)
· 원격 서비스를 실행하는 서버
· RMI 이름 지정 서비스, 이 원격 서비스를 발견할 수 있도록 허용 클라이언트
· 클래스 파일의 공급자(HTTP 또는 FTP 서버
· 이 원격 서비스가 필요한 클라이언트 프로그램
원격 서비스의 인터페이스 정의 Server.java:
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Server extends Remote{ // Remote

String hellpWorld(String name) throws RemoteException;

Person getPerson(String name,int age)throws RemoteException;

}

Person 객체(네트워크 전송, 정렬화되어야 함):
import java.io.Serializable;

public class Person implements Serializable{
private String name;
private int age;

public Person(String name, int age) {
super();
this.name = name;
this.age = 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 "Person [name=" + name + ", age=" + age + "]";
}

}

원격서비스 인터페이스의 구체적인 구현 ServerImpl.java:
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;

// UnicastRemoteObject
public class ServerImpl extends UnicastRemoteObject implements Server {

protected ServerImpl() throws RemoteException {
super();
}

public String hellpWorld(String name) throws RemoteException {
return name+" ";
}

public Person getPerson(String name, int age) throws RemoteException {
return new Person(name,age);
}
//
public void info(){
System.out.println(" ");
}

public static void main(String[] args) throws RemoteException, MalformedURLException {
Server imp=new ServerImpl();
//
LocateRegistry.createRegistry(1097);
Naming.rebind("rmi://:1097/jim", imp);
}

}

클라이언트:
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

public class RMIClient {

/**
*
@param args
*
@throws NotBoundException
*
@throws RemoteException
*
@throws MalformedURLException
*/
public static void main(String[] args) throws MalformedURLException, RemoteException, NotBoundException {
Server ser=(Server) Naming.lookup("rmi://:1097/jim");
System.out.println(ser.hellpWorld("jim"));
System.out.println(ser.getPerson("jim", 24));
}

}

 
클라이언트가 원격 서비스 인터페이스에 원격 메서드를 호출하면 다음 단계를 거쳐야 합니다.
  • 로컬 클라이언트가 원격 서비스 대상을 호출하는 방법 ----- 실제로는 Stub 대상을 호출하는 방법이다.
  • Stub 대상은 사실 원격 서비스 대상이 클라이언트의 에이전트에 있는 것이다.Stub 객체는 원격 호출 요청이 네트워크에서 전송될 수 있도록 호출 요청을 인코딩합니다.그래서 이 단계는 원격 방법을 호출해야 하기 때문에 매개 변수는 모두 서열화할 수 있다.
  • 기본 네트워크를 통해 요청을 Skeleton으로 전송합니다.
  • Skeleton은 Stub가 네트워크를 통해 전송한 호출 요청을 받은 후, Skeleton은 요청을 디코딩하여 원격 서비스 대상의 요구를 충족시키는 요청으로 전환한다
  • Skeleton은 디코딩된 요청을 원격 서비스 대상에 발송하여 원격 서비스 대상이 호출 요청을 처리하도록 한다.
  • Skeleton은 원격 서비스 대상의 실행 결과(즉 방법 반환 값)를 받은 후 다시 실행 결과를 인코딩합니다. 따라서 이 단계에서 RMI의 방법 반환 값은 모두 서열화되어야 합니다.
  • 하부 네트워크를 통해 Stub로 처리 결과 전송
  • Stub 디코딩 결과
  • Stub는 로컬 클라이언트의 요구에 부합하는 디코딩 결과를 로컬 클라이언트에게 보냅니다
  • 로컬 클라이언트가 실행 결과를 받았습니다.가상은: 로컬 클라이언트가 원격 자바 방법을 성공적으로 호출했습니다.

  •  
     

    좋은 웹페이지 즐겨찾기