最近在学习序列化,看到远程调用也和序列化有关,于是顺便学学RMI,权当玩玩
1:所谓远程,并不需要分布在Internet上,或者在局域网中个,或者在同一台计算机的不同虚拟机之间,我们都可以称之为远程。EJB的实现也是以Java RMI为基础核心的。RMI远程方法调用,可以跨机器通过网络调用,不过Java RMI只支持两边都是Java程序,如果要实现完全两边异构,那么就要用到传说中的Web Service了。为了看好效果,都要建立两个或两个以上工程,当然,如果你有两个机器并通过局域网相连更好,如果能同有互联网的条件就更好了,以下是同一机器不同工程之间的小测试。
(1)首先建立一个服务端的工程,就叫RMIServerTest吧
(2)创建接口ServerInterface,继承Remote接口
package com.bona.rmi.server; import java.rmi.Remote; import java.rmi.RemoteException; /** * 定义远程接口,必须继承Remote接口, * 其中所有需要远程调用的方法都必须抛出RemoteException异常 */ public interface HelloInterface extends Remote { public String sayHello(String name) throws RemoteException; }
(3)创建接口的实现类 HelloInterfaceImpl,继承UnicastRemoteObject ,实现 HelloInterface 接口
package com.bona.rmi.server; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class HelloInterfaceImpl extends UnicastRemoteObject implements HelloInterface{ private static final long serialVersionUID = 1L; public HelloImpl() throws RemoteException { super(); } @Override public String sayHello(String name) throws RemoteException { return "Hello, " + name; } }
说明:接口的实现类同时要实现Serializable接口,这里继承UnicastRemoteObject也是间接实现Serializable接口,同时,因为构造方法需要抛出RemoteException,所以不能缺省使用隐含的无参构造方法,而应该自己显式定义构造方法。
(3)创建应用类,注册和启动服务端RMI,以被客户端调用
package com.bona.rmi.server; import java.net.MalformedURLException; import java.rmi.AlreadyBoundException; import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; public class HelloServer { public static void main(String args[]) { try { //创建一个远程对象 HelloInterface rhello = new HelloInterfaceImpl(); //生成远程对象注册表Registry的实例,并指定端口为8888(默认端口是1099) LocateRegistry.createRegistry(8888); //把远程对象注册到RMI注册服务器上,并命名为RHello //绑定的URL标准格式为:rmi://host:port/name(协议名可以省略,下面两种写法都可以) Naming.bind("rmi://10.225.112.86:8888/HelloInterface", rhello); //Naming.bind("//10.225.112.86:8888/HelloInterface",rhello); System.out.println(">>INFO:远程HelloInterface对象绑定成功!"); } 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(); } } }
运行HelloServer,看到
>>INFO:远程HelloInterface对象绑定成功!
(4)新建一个新的工程,为了方便,也是Java Project,就叫RMIClientTest,
(5) 因为客户端需要有服务端那边提供的接口,才可以访问,所以要将服务端的HelloInterface接口完全拷贝(连同包)到客户端,当然为了方便,你在客户端工程中新建一个完全一样的接口也可以。实际运用中通常是要服务端接口打成jar包来提供的。
(6)创建客户端调用类
package com.bona.rmi.client; import java.rmi.Naming; import com.bona.rmi.server.HelloInterface; public class HelloClient { public static void main(String args[]) { try { // 在RMI服务注册表中查找名称为RHello的对象,并调用其上的方法 HelloInterface rhello = (HelloInterface) Naming.lookup("rmi://10.225.112.86:8888/HelloInterface"); System.out.println(rhello.sayHello("白哥")); } catch (Exception e) { e.printStackTrace(); } } }
运行,显示成功
相关推荐
Java RMI的应用——学习RMI的简单编程应用。编写一个课程成绩管理程序,要求用Java RMI实现
JAVA远程调用RMI与应用
在这次的项目中,对于客户端与服务器之间的通信,想了许多办法,由于做的是富客户端应用,最终将技术选定在了RMI和Java-sockets两种之间,其中RMI的灵活性不高,客户端和服务器端都必须是java编写,但使用比较方便,...
创建客户端RMI调用服务端的应用程序。 启动服务端,再启动客户端,测试是否调用成功。 如果客户端和服务端不在同一台电脑上,则需要对刚才定义的服务类采用rmic 编译一个客户端的框架类_stub并拷贝到客户端的类...
使用Java实现RMI技术应用,初次了解中间技术。
Java RMI (Remote Method Invocation 远程方法调用)是用Java在JDK1.1中实现的,它大大增强了Java开发分布式应用的能力。
JAVA_RMI_实例.pdf
用Java RMI开发的应用系统可以部署在任何支持JRE(Java Run Environment Java,运行环境)的平台上。但由于JRMP是专为Java对象制定的,因此,RMI对于用非Java语言开发的应用系统的支持不足。不能与用非Java语言书写...
工厂设计模式在Java RMI中的应用研究
由于Java具有跨平台、代码可移植性、安全高效等广泛而强大的功能,因而在开发网络分布式应用的时候,可以用它自身的机制实现分布式计算,一种基于Java的远程方法调用(RMI)为我们开发企业分布式应用提供了行之有效的...
javaRMI完整版.pdf
基于Java—RMI分布式技术的应用研究.pdf
基于Java的RMI技术的研究与应用.pdf
分布式对象技术课程实践:基于rmi的数据库中间件设计,并利用中间件建立一个数据库应用(Java web项目)。 需求分析 数据库操作中间件: 提供数据库连接接口。该接口可使“数据库操作中间件”连接当前主流的数据库...
底层的通信由RMI实现,对于系统开发人员来说,远程调用和标准的Java方法调用没有什么区别。 为需要传递的对象装载类的字节码 RMI允许调用者向远程对象传递一个对象,因此 RMI提供这种装载对象的机制。
Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程...
实验名称 基于Socket的C/S编程实验 实验名称 基于Java RMI的C/S编程实验
讲述利用java rmi进行分布式应用开发的相关知识
使用Java的RMI来实现远程控制的小程序,类似qq的远程协助。 本程序是根据网上看到的源代码改写而成,主要在用户界面和服务端与客户端的交互上增加了许多功能,并对代码结构进行了重新组织。里面附有原作者的链接,...