자바 의 RMI 사용 에 대한 자세 한 설명

8149 단어 자바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 프로 토 콜 에 서 는 대상 서열 화 를 사용 합 니 다).
  • 클 라 이언 트 쪽 에 Stub 를 구성 하여 서버 쪽 에 보 낼 수 있 는 정보 블록 이 있 는 이상 서버 쪽 에 이 정 보 를 빨리 받 는 대상 이 있 을 것 입 니 다.Skeleton 이 라 고 합 니 다.
    그것 의 주요 업 무 는:
  • 정보 가 빠 른 호출 대상 식별 자 와 방법 설명 을 분석 하고 서버 에서 구체 적 인 대상 방법 을 호출 합 니 다.
  • 호출 된 반환 값 이나 이상 값 을 가 져 옵 니 다.
  • 반환 값 을 편성 하여 클 라 이언 트 Stub.
  • 에 게 되 돌려 줍 니 다.
    여기까지 클 라 이언 트 에서 서버 에 대한 호출 결 과 를 얻 을 수 있 습 니 다.
    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 사용 에 관 한 더 많은 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

    좋은 웹페이지 즐겨찾기