자바 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 에 관 한 더 많은 내용 은 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 읽 어 주시 기 바 랍 니 다.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.