Java RMI는 원격 메소드 호출을 나타냅니다. 한 Java 가상 머신의 객체가 다른 Java 가상 머신의 객체에 대한 메소드를 호출할 수 있도록 하는 메커니즘입니다. 이 메서드로 호출할 수 있는 모든 개체는 원격 인터페이스를 구현해야 합니다. (추천: java 동영상 튜토리얼)
Java RMI는 새로운 기술은 아니지만(Java 1.1 시대부터 가능했습니다) 매우 중요한 기반 기술입니다. .
유명한 EJB는 모두 rmi를 기반으로 구축되었습니다. 이제 일부 오픈 소스 원격 호출 구성 요소가 있으며 그 기본 기술도 rmi입니다.
웹 서비스와 SOA를 활발히 홍보하는 시대에 모든 애플리케이션을 서투른 웹 서비스 구성 요소를 사용하여 구현해야 합니까? 비교 테스트를 거쳐 보면 일부 소규모 애플리케이션에서는 RMI가 가장 적합합니다.
다음은 간단한 예제를 사용하여 RMI의 원리와 응용 프로그램을 설명합니다. 다음 예제는 간단한 HelloWorld이지만 RMI의 핵심 응용 프로그램과 개발 모델을 다루고 있습니다.
/** * Created by IntelliJ IDEA. * User: leizhimin * Date: 2008-8-7 21:50:02 * 定义一个远程接口,必须继承Remote接口,其中需要远程调用的方法必须抛出RemoteException异常 */ public interface IHello extends Remote { /** * 简单的返回“Hello World!"字样 * @return 返回“Hello World!"字样 * @throws java.rmi.RemoteException */ public String helloWorld() throws RemoteException; /** * 一个简单的业务方法,根据传入的人名返回相应的问候语 * @param someBodyName 人名 * @return 返回相应的问候语 * @throws java.rmi.RemoteException */ public String sayHelloToSomeBody(String someBodyName) throws RemoteException; }
/** * Created by IntelliJ IDEA. * User: leizhimin * Date: 2008-8-7 21:56:47 * 远程的接口的实现 */ public class HelloImpl extends UnicastRemoteObject implements IHello { /** * 因为UnicastRemoteObject的构造方法抛出了RemoteException异常,因此这里默认的构造方法必须写,必须声明抛出RemoteException异常 * * @throws RemoteException */ public HelloImpl() throws RemoteException { } /** * 简单的返回“Hello World!"字样 * * @return 返回“Hello World!"字样 * @throws java.rmi.RemoteException */ public String helloWorld() throws RemoteException { return "Hello World!"; } /** * 一个简单的业务方法,根据传入的人名返回相应的问候语 * * @param someBodyName 人名 * @return 返回相应的问候语 * @throws java.rmi.RemoteException */ public String sayHelloToSomeBody(String someBodyName) throws RemoteException { return "你好," + someBodyName + "!"; } }
/** * Created by IntelliJ IDEA. * User: leizhimin * Date: 2008-8-7 22:03:35 * 创建RMI注册表,启动RMI服务,并将远程对象注册到RMI注册表中。 */ public class HelloServer { public static void main(String args[]) { try { //创建一个远程对象 IHello rhello = new HelloImpl(); //本地主机上的远程对象注册表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(">>>>>INFO:远程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(); } } }
/** * Created by IntelliJ IDEA. * User: leizhimin * Date: 2008-8-7 22:21:07 * 客户端测试,在客户端调用远程对象上的远程方法,并返回结果。 */ public class HelloClient { public static void main(String args[]){ try { //在RMI服务注册表中查找名称为RHello的对象,并调用其上的方法 IHello rhello =(IHello) Naming.lookup("rmi://localhost:8888/RHello"); System.out.println(rhello.helloWorld()); System.out.println(rhello.sayHelloToSomeBody("熔岩")); } catch (NotBoundException e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } } }
RMI 서버 프로그램 실행:
RMI 클라이언트 프로그램 실행:
# 🎜🎜#
요약: 위 과정에서 RMI는 서버의 IP 주소와 포트에 크게 의존하지만, 향후 서버는 개발 중에 알 수 없습니다. IP와 포트에 관한 것이지만 클라이언트 프로그램은 이 IP와 포트에 의존합니다. 이것도 RMI의 한계 중 하나입니다. 이 문제를 해결하는 방법에는 두 가지가 있습니다. 하나는 DNS를 통해 해결하는 것이고, 다른 하나는 캡슐화를 통해 IP를 프로그램 코드 외부에 노출시키는 것입니다. RMI의 두 번째 제한은 RMI가 Java 언어로 된 원격 호출이라는 것입니다. 서로 다른 언어 간의 통신을 위해서는 웹 서비스 또는 공용을 사용하는 것을 고려할 수 있습니다. 개체 요청 프록시 시스템(CORBA)을 달성합니다. 자바에 대한 더 많은 지식은java 기본 튜토리얼 칼럼을 주목해주세요.
위 내용은 Java RMI 소개(예제 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!