자바 의 RMI 사용 에 대한 자세 한 설명
RMI 소개
RMI(Remote Method Invocation)모델 은 분포 식 대상 응용 프로그램 으로 RMI 기술 을 사용 하면 JVM 의 대상 을 다른 JVM 의 대상 방법 으로 호출 하고 호출 결 과 를 얻 을 수 있다.이곳 의 또 다른 JVM 은 같은 컴퓨터 에서 도 원 격 컴퓨터 로 도 사용 할 수 있다.따라서 RMI 는 서버 엔 드 와 클 라 이언 트 엔 드 가 필요 하 다 는 뜻 이다.
서버 쪽 에 서 는 원 격 으로 접근 할 수 있 도록 대상 을 만 듭 니 다.
이 대상 은 원 격 대상 이 라 고 불 린 다.서버 쪽 에서 이 대상 을 등록 해 야 클 라 이언 트 가 원 격 으로 접근 할 수 있 습 니 다.
클 라 이언 트 쪽 에서 원 격 으로 접근 할 수 있 는 대상 의 방법 을 호출 하면 클 라 이언 트 쪽 에서 서버 쪽 과 통신 하고 서로 정 보 를 전달 할 수 있 습 니 다.
여기까지 말 하면 RMI 를 사용 하여 분포 식 응용 을 구축 할 때 매우 편리 하고 RPC 와 마찬가지 로 분포 식 응용 간 의 상호 통신 을 실현 할 수 있 으 며 심지어 현재 의 마이크로 서비스 사상 과 매우 유사 하 다 는 것 을 발견 한 것 입 니까?
RMI 작업 원리
이른바'그 이 유 를 알 고 있다'는 것 은 RMI 코드 를 작성 하기 전에 RMI 의 작업 원 리 를 알 필요 가 있 습 니 다.RMI 에서 Client 단 은 Server 단 과 어떻게 통신 하 는 지 알 필요 가 있 습 니까?
다음 그림 은 RMI 의 업무 절 차 를 이해 하 는 데 도움 을 줄 수 있다.
그림 에서 볼 수 있 듯 이 Client 엔 드 에는 Stub 라 고 불 리 는 것 이 있 습 니 다.때로는 메모리 루트 가 되 기도 합 니 다.RMI Client 의 프 록 시 대상 입 니 다.Stub 의 주요 기능 은 원 격 방법 을 요청 할 때 정보 블록 을 구성 하 는 것 입 니 다.RMI 프로 토 콜 은 이 정보 블록 을 Server 엔 드 에 보 냅 니 다.
이 정보 블록 은 몇 부분 으로 구성 되 어 있 습 니 다.
그것 의 주요 업 무 는:
여기까지 클 라 이언 트 에서 서버 에 대한 호출 결 과 를 얻 을 수 있 습 니 다.
RMI 개발
위의 소 개 를 통 해 RMI 의 개념 과 RMI 의 작업 원 리 를 알 게 되 었 고,다음은 RMI 의 개발 절 차 를 소개 한다.
클 라 이언 트 측 이 사용자 정 보 를 조회 해 야 한다 고 가정 하고 사용자 정 보 는 서버 측 에 존재 하기 때문에 서버 측 에서 클 라 이언 트 호출 조 회 를 위해 RMI 프로 토 콜 인 터 페 이 스 를 열 었 습 니 다.
RMI Server
서버 엔 드 는 주로 전송 가능 한 클래스 User 를 구축 하고 원 격 으로 접근 할 수 있 는 클래스 UserService 를 구축 하 는 동시에 이 대상 은 RMI 에 등록 하여 클 라 이언 트 에 사용 해 야 합 니 다.
1.서버 인 터 페 이 스 를 정의 합 니 다(Remote 클래스 를 계승 해 야 합 니 다.방법 은 Remote Exception 을 던 져 야 합 니 다).
package com.wdbyte.rmi.server;
import java.rmi.Remote;
import java.rmi.RemoteException;
/**
* RMI Server
*
* @author www.wdbyte.com
* @date 2021/05/08
*/
public interface UserService extends Remote {
/**
*
*
* @param userId
* @return
* @throws RemoteException
*/
User findUser(String userId) throws RemoteException;
}
User 대상 은 단계 3 에서 정의 합 니 다.2.서버 인터페이스 구현(유 니 캐 스 트 RemoteObject 클래스 를 계승 하여 정 의 된 인터페이스 구현).
package com.wdbyte.rmi.server;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
/**
* @author www.wdbyte.com
* @date 2021/05/08
*/
public class UserServiceImpl extends UnicastRemoteObject implements UserService {
protected UserServiceImpl() throws RemoteException {
}
@Override
public User findUser(String userId) throws RemoteException {
//
if ("00001".equals(userId)) {
User user = new User();
user.setName(" ");
user.setAge(100);
user.setSkill(" ");
return user;
}
throw new RemoteException(" ");
}
}
3.전송 대상 을 정의 하고 전송 대상 은 직렬 화(Serializable)인 터 페 이 스 를 실현 해 야 합 니 다.전송 이 필요 한 종 류 는 반드시 직렬 화 인 터 페 이 스 를 실현 해 야 한다.그렇지 않 으 면 전송 할 때 오류 가 발생 할 수 있다.IDEA 에서 serial VersionUID 를 어떻게 생 성 하 는 지 는 글 말미 에 도 간단 한 튜 토리 얼 을 첨부 합 니 다.
package com.wdbyte.rmi.server;
import java.io.Serializable;
/**
*
* @author www.wdbyte.com
* @date 2021/05/08
*/
public class User implements Serializable {
private static final long serialVersionUID = 6490921832856589236L;
private String name;
private Integer age;
private String skill;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSkill() {
return skill;
}
public void setSkill(String skill) {
this.skill = skill;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", skill='" + skill + '\'' +
'}';
}
}
4.원 격 대상 을 등록 하고 서버 프로그램 을 시작 합 니 다.서버 는 UserService 대상 을 원 격 접근 대상 으로 연결 하고 시작 할 때 포트 는 1900 으로 설정 합 니 다.
package com.wdbyte.rmi.server;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
/**
* RMI Server
*
* @author https://www.wdbyte.com
* @date 2021/05/08
*/
public class RmiServer {
public static void main(String[] args) {
try {
UserService userService = new UserServiceImpl();
LocateRegistry.createRegistry(1900);
Naming.rebind("rmi://localhost:1900/user", userService);
System.out.println("start server,port is 1900");
} catch (Exception e) {
e.printStackTrace();
}
}
}
RMI Client서버 쪽 에 비해 클 라 이언 트 쪽 이 훨씬 간단 합 니 다.원 격 접근 과 전송 이 필요 한 클래스 를 직접 도입 하여 포트 와 서버 단 을 통 해 연 결 된 주 소 를 통 해 호출 할 수 있 습 니 다.
package com.wdbyte.rmi.client;
import java.rmi.Naming;
import com.wdbyte.rmi.server.User;
import com.wdbyte.rmi.server.UserService;
/**
* @author https://www.wdbyte.com
* @date 2021/05/08
*/
public class RmiClient {
public static void main(String args[]) {
User answer;
String userId = "00001";
try {
// lookup method to find reference of remote object
UserService access = (UserService)Naming.lookup("rmi://localhost:1900/user");
answer = access.findUser(userId);
System.out.println("query:" + userId);
System.out.println("result:" + answer);
} catch (Exception ae) {
System.out.println(ae);
}
}
}
RMI 테스트서버 엔 드 를 시작 합 니 다.
start server,port is 1900
클 라 이언 트 엔 드 를 시작 합 니 다.
query:00001
result:User{name=' ', age=100, skill=' '}
클 라 이언 트 쪽 에 존재 하지 않 는 userId 가 들 어 오 면
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.RemoteException:
serial VersionUID 생 성IDEA 에서 serialVersionUID 를 생 성하 고 설정 을 엽 니 다.다음 그림 에서 선택 하 십시오.
serialVersionUID 를 생 성 할 클래스 를 선택 하고 스마트 알림 단축 키 를 누 르 십시오.
레 퍼 런 스
[1] https://docs.oracle.com/javase/tutorial/rmi/overview.html
자바 의 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에 따라 라이센스가 부여됩니다.