J2EE--RMI

RMI:

Java RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。

使用:

定义一个远程接口类:

<span style="font-size:18px;">import java.rmi.Remote;
import java.rmi.RemoteException;
//定义一个远程接口,必须继承Remote接口,其中需要远程调用的方法必须抛出RemoteException异常
public interface IHello extends Remote {
	public String helloWorld() throws RemoteException;
	public String sayHelloToPerson(String username) throws RemoteException;

}</span>

远程接口的实现类:

<span style="font-size:18px;">import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class HelloImplC extends UnicastRemoteObject implements IHello {
	protected HelloImplC() throws RemoteException {
	}
	public String helloWorld() throws RemoteException {
		return "你好";
	}
	public String sayHelloToPerson(String username) throws RemoteException {
		return "a你好a"+username+"欢迎光临";
	}
}</span>

需要继承UnicastRemoteObject类,同时因为UnicastRemoteObject的构造方法抛出了RemoteException异常,因此这里默认的构造方法必须写,必须声明抛出RemoteException异常。

下面是重要的服务端,负责创建RMI注册表,启动RMI服务,并将远程对象注册到RMI注册表中。

<span style="font-size:18px;">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 {
			// 创建一个远程对象
			IHello rhello = new HelloImplE();
			// 本地主机上的远程对象注册表Registry的实例,并指定端口为8888,
			// 这一步必不可少(Java默认端口是1099),必不可缺的一步,缺少注册表创建,则无法绑定对象到远程注册表上 
			LocateRegistry.createRegistry(8888);
			// 把远程对象注册到RMI注册服务器上,并命名为RHello 
			// 绑定的URL标准格式为:rmi://host:port/name 
			Naming.bind("rmi://localhost:8888/RHello", rhello);
			System.out.println(">>>>>INFO:远程IHello对象绑定成功!");

		} catch (RemoteException e) {
			System.out.println("创建远程对象发生异常!");
		} catch (AlreadyBoundException e) {
			System.out.println("发生重复绑定对象异常!");
			e.printStackTrace();
		} catch (MalformedURLException e) {
			System.out.println("发生URL畸形异常!");
			e.printStackTrace();
		}
	}
}</span>

在客户端调用远程方法代码:

<span style="font-size:18px;">import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
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.sayHelloToPerson("小康"));
		} catch (NotBoundException e) {
			e.printStackTrace();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (RemoteException e) {
			e.printStackTrace();
		}
	}

}</span>

运行结果:

运行RMI服务端程序结果:

运行RMI客户端程序的结果:

通过这个例子我们可以看出,只要客户端实现了服务器端的远程调用接口,并且知道服务器的地址,即可调用服务器端的方法。

总结:

从上面的过程来看,RMI对服务器的IP地址和端口依赖很紧密,但是在开发的时候不知道将来的服务器IP和端口如何,但是客户端程序依赖这个IP和端口。这也是RMI的局限性之一。这个问题有两种解决途径:一是通过DNS来解决,二是通过封装将IP暴露到程序代码之外。

RMI的局限性之二是RMI是Java语言的远程调用,两端的程序语言必须是Java实现,对于不同语言间的通讯可以考虑用WebService或者公用对象请求代理体系(CORBA)来实现。

J2EE--RMI

时间: 2024-08-27 23:26:07

J2EE--RMI的相关文章

【J2EE浅析】——RMI

一.RMI概述 RMI(Remote Method Invoke)-远程调用方法,是java的一组用户开发分布式应用程序的API.通过该RMI机制,可以实现程序组件在不同操作系统之间的通信.它是一种被EJB使用的更底层的协议,比如:一个EJB可以通过RMI调用Web上另一台机器上的EJB远程方法. RMI使用了序列化方式在客户端和服务器端传递数据, 这样,我们就可以在远程方式下编写和使用对象,而不必知道它们实际上是远程的对象. 目标: *无缝地支持在不同的Java虚拟机上的远程对象的使用. *支

J2EE规范

J2EE是由SUN提出的用于简化开发企业级应用程序的一系列规范的组合,J2EE基于中间层集成的框架的方式为应用开发提供了一个统一的开发平台.基于容器管理.组件化的模型为企业建立一个高可用性,高可靠性可扩展的应用平台提供支持,降低了开发分布式应用程序的难度,降低了开发成本,而且提供一整套方便与旧的遗留系统相集的强有力支持,并提供了安全性及规范的打包安装的支持.开发人员使用的J2EE规范开发的应用程序将受厂商及客户的支持. J2EE是由一整套服务,应用程序接口及协议构成,提供对开发多层Web程序应用

EJB、RMI、XMLRPC、Hessian、Thrift 、Protobuf

Java中实现分布式的方式有:EJB.RMI.XMLRPC.Web Service.Hessian.Thrift .Protobuf.NIO(Netty.Mina) EJB 优势:可扩展性好,安全性强,支持分布式事务处理. 劣势:不能跨语言:配置相对复杂,不同J2EE容器之间很难做无缝迁移. RMI 优势:面向对象的远程服务模型:基于TCP协议上的服务,执行速度快. 劣势:不能跨语言:每个远程对象都要绑定端口,不易维护:不支持分布式事务JTA,RMI框架对于安全性.事务.可扩展性的支持非常有限.

Java分布式处理技术(RMI,JDNI)

http://hedaoyuan.blog.51cto.com/4639772/813702 1.1 RMI的基本概念 1.1.1 什么是RMI RMI(Remote Method Invocation)远程方法调用是一种计算机之间对象互相调用对方函数,启动对方进程的一种机制,使用这种机制,某一台计算机上的对象在调用另外一台计算机上的方法时,使用的程序语法规则和在本地机上对象间的方法调用的语法规则一样. 1.1.2 RMI的用途 1. 分布式体系结构 我们为什么要使用分布式计算呢? Ø 当我们想

J2EE13个规范--【J2EE】

JDBC(Java Database Connectivity): JDBC API为访问不同的数据库提供了一种统一的途径,象ODBC一样,JDBC对开发者屏蔽了一些细节问题,另外,JDCB对数据库的访问也具有平台无关性.JDBC跟ODBC代码类似,都是进行数据库链接的功能. JNDI(Java Name and Directory Interface): JNDI API被用于执行名字和目录服务.它提供了一致的模型来存取和操作企业级的资源如DNS和LDAP,本地文件系统,或应用服务器中的对象.

RMI、Hessian、Burlap、Httpinvoker、WebService的比较

RMI.Hessian.Burlap.Httpinvoker.WebService的比较 2(转)     [2]Java远程调用方法性能比较 [IT168技术]现在,Java远程调用方法很多,各种方法的优缺点网络上也有很多的参考文章,这次我对几个典型的Java远程调用方法做了一个简单的性能分析比较,可供大家参考. 测试环境 CPU:奔腾双核 T4500,内存:DDR3-1067 2G,Web容器:Tomcat6.0.33,操作系统:WinXP-sp3 测试项目 ①RMI:用Spring3集成发

J2EE中你必须了解的13种技术规范

1)JDBC(Java Database Connectivity): JDBC API为访问不同的数据库提供了一种统一的途径,象ODBC一样,JDBC对开发者屏蔽了一些细节问题,另外,JDCB对数据库的访问也具有平台无关性. 2)JNDI(Java Name and Directory Interface): JNDI API被用于执行名字和目录服务.它提供了一致的模型来存取和操作企业级的资源如DNS和LDAP,本地文件系统,或应用服务器中的对象. 3)EJB(Enterprise JavaB

J2EE 13个规范概览

J2EE平台由一整套服务(Services).应用程序接口(APIs)和协议构成,它对开发基于Web的多层应用提供了功能支持.下面对J2EE中的13种进行简单的描述: 1. JDBC(Java Database Connectivity): JDBC API为访问不同的数据库提供了一种统一的途径,象ODBC一样,JDBC对开发者屏蔽了一些细节问题,另外,JDCB对数据库的访问也具有平台无关性. 简单说JDBC可以干三件事:与数据库连接.发送操作数据库的语句.处理结果: 2. JNDI(Java

J2EE规范标准

J2EE是一个很大的平台体系,提供了很多服务.程序接口.协议等.这么庞大的体系必须要由一系列的标准进行规范,不然将会一片混乱.通过这些规范好的接口来开发程序将会使程序更加强壮.更加有生命力.总的来说,规范是一种抽象思维的体现,它的好处就是达到了约束所有厂商的效果,抽象出一个统一的规范接口,使我们在编程时使用统一的接口,兼容性得到保证,与底层具体实现达到高度隔离解耦.我们知道,J2EE有十三个规范,每个标准提供不同的服务,应用的场合也不同,这十三个规范并非全部都是标准的,只有标准的规范才会在JDK

通俗理解J2EE的13种规范

学习到Java就不得不了解为人熟知的13种规范,小编从网上各种搜集资料,可是都是一些专业性的术语,确实很令人费解,讲解的都很抽象.在小编的不懈努力之下,通过看别人的博客,汇总了以下的内容. 1.JDBC(java Database Connectivity):   官方:JDBC API为访问不同的数据库提供了一种统一的途径,就像ODBC一样,JDBC对开发者屏蔽了一些细节问题,同时,JDBC对数据库的访问也具有平台无关性. 小编:学习过.NET的一定了解ODBC,这是属于同一个性质的,就是为了