Java分布式之RMI实例教程 网络通信原理

合集下载

分布式对象技术RMI

分布式对象技术RMI

5.1 RMI结构 结构
RMI 实现结构可以分为三层: 实现结构可以分为三层: 1. Stub/Skeleton层 层 2. 远程引用层 3. 传输层 Stub Sub/Skeleton层实现传输数据的调度和 层实现传输数据的调度和 反调度机制。 反调度机制。调度就是把数据或对象 转换成字节流, 转换成字节流,反调度则把字节流转 换成数据或对象。 换成数据或对象。 远程引用层定义了RMI连接的调用语义 连接的调用语义 远程引用层定义了 即如何调用远程对象的方法。 即如何调用远程对象的方法。Java远程 远程 方法协议(Java Remote Method Protocol) 方法协议 使用java.rmi.server.RemoteRef 使用 Skeleton 客户调用远程对象 方法 远程对象
JavaRMI 第2例: 例 分为以下四个步骤 1. 创建远程接口及声明远程方法(HelloInterface.java) 创建远程接口及声明远程方法( ) 2. 实现远程接口及远程方法(继承 实现远程接口及远程方法(继承UnicastRemoteObject)(Hello.java) ) 3. 启动 启动RMI注册服务,并注册远程对象(HelloServer.java) 注册服务, 注册服务 并注册远程对象( ) 4. 客户端查找远程对象,并调用远程方法(HelloClient) 客户端查找远程对象,并调用远程方法( ) 5. 执行程序:启动服务 执行程序:启动服务HelloServer;运行客户端 ;运行客户端HelloClient进行调用 进行调用
1. 定义远程接口(服务接口 定义远程接口 服务接口) 服务接口
import java.rmi.Remote; import java.rmi.RemoteException; /** * RMI调用对象接口定义 * @author 王华东 */ public interface InterfaceService extends Remote { /**远程服务对象所必须实现的方法 * 所有的远程调用的方法,必须声明throws RemoteException * */ Object service(Object obj) throws RemoteException; }

javaRMI及简单实例

javaRMI及简单实例

远程方法调用实验报告1.摘要简单介绍了java中的RMI框架的基本原理及应用,给出了java 中创建一个RMI应用的基本步骤。

在此基础上设计了一个采用RMI技术实现远程方法调用的实验,客户端调用服务器端的远程对象的方法,获取服务器端的系统时间,将结果返回客户端。

此外还对实验结果还进行了分析。

2.实验背景RMI采用客户/服务器通信方式。

在服务器上部署了提供各种服务的远程对象,客户端请求访问服务器上的远程对象的方法。

如图1所示,是RemoteServiceClass一个远程对象,它运行在服务器上,客户端请求调用RemoteServiceClass对象的echo()方法。

图1 客户端请求调用服务器上的远程对象的方法如图2所示,RMI采用代理来负责客户和远程对象之间通过Socket进行通信的细节。

RMI框架为远程对象分别生成了客户端代理和服务器端代理。

位于客户端的代理类称为存根(Stub),位于服务器端的代理类称为骨架(Skeleton)。

图2 RMI框架采用代理来封装通信细节当客户端调用远程对象的一个方法时,实际上是调用本地存根对象的相应方法。

存根对象和远程对象具有同样的接口。

存根采用一种与平台无关的编码方式,把方法的参数编码为字节序列,这个编码过程称为参数编组。

RMI主要采用java序列化机制进行参数编组。

接着,存根把请求信息发送给服务器,服务器端接收到客户端的请求信息,然后由相应的骨架对象来处理这一请求信息,把处理后的返回值或者异常编组后发送给客户。

客户端的存根接收到服务器发送过来的编组后的返回值或者异常,再对它进行反编组,就得到调用远程方法的返回结果。

存根与骨架类通过Socket来通信。

开发人员无须手工编写客户端的存根类及服务器端的骨架类,它们都由RMI框架创造。

在JDK5.0以前的版本中,需要用rmic命令来为远程对象生成静态的代理类(包括存根和骨架类)。

而在JDK5.0中,RMI框架会在运行时自动为远程对象生成动态代理类(包括存根和骨架类),从而更彻底封装了RMI 框架的实现细节,简化了RMI框架的使用方式。

Java分布式之RMI简介及实例

Java分布式之RMI简介及实例

Java分布式之RMI简介及实例前言最近的联通项目,下一阶段可能会涉及到和各省间的RMI接口,所以总结一下08年中国移动自动拨测系统用到的RMI技术,以备不时之需。

同时也给广大初哥提供一些学习资料,哈哈。

前几年,一直忙于项目,没怎么做系统总结。

以后计划写一些以前项目用过的Java分布式技术实例教程,如:RMI、Socket、Mina、SNMP、SOAP、Web Service、Hessian、JMS等。

希望和大家一起交流,分享经验,一起提高。

RMI简介RMI,远程方法调用(Remote Method Invocation是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。

RMI是非常容易使用的,但是它非常的强大。

RMI的基础是接口,RMI构架基于一个重要的原理:定义接口和定义接口的具体实现是分开的。

看看jboss-remoting:基本原理要实现网络机器间的通讯,首先得来看看计算机系统网络通信的基本原理,在底层层面去看,网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络IO来实现,其中传输协议比较出名的有http、tcp、udp等等,http、tcp、udp都是在基于Socket概念上为某类应用场景而扩展出的传输协议,网络IO,主要有bio、nio、aio三种方式,所有的分布式应用通讯都基于这个原理而实现,只是为了应用的易用,各种语言通常都会提供一些更为贴近应用易用的应用层协议。

主要步骤分为以下几个步骤:1. 创建远程接口及声明远程方法(RmiMonitorService.java2. 实现远程接口及远程方法(继承UnicastRemoteObject(RmiMonitorServiceImpl.java3. 启动RMI注册服务,并注册远程对象(RmiServer.java4. 客户端查找远程对象,并调用远程方法(MonitorClient.java5. 运行实例业务场景在移动拨测系统管理端中要融合实时显示。

浅谈JavaRMI

浅谈JavaRMI
p ca e t s : a k g e t
i ot j v m irg s r. : p m r a a . .e i ty } ip r a a r isr e . m ot j v a .e vr : .
p b i l s e f c T m x e d n c s R m t O j c i l m n s u lc ca s Pr e t ie e tn sU ia t eo eb e t m ee t p
它们分别对应的是根 (tb和干 ( ee o) su ) s ltn . k
i p r a a n t } m o t j v. e . : ip r a a r . m o t j v mi . :
RI M 全部的宗 旨就是可能简化远程接口对象的使用 。我 们客户程序中要做的唯一一件额外事情是查找从服务器取 回
确 计 时 服 务
/ P re t ie j v / ef cT m .a a / W e i p e e t t o f t e P r e t ie r m t b e t /h m lm na in o h e fc Tm eo e o jc
a k ̄ e p c te t: s
器端的传输层传递回客户端,再向上 经传输层和远程调用层 返回。最后 ,占位程序获得返回值 。 而要完成 以下调用过程 ,需要 有 以下几个 步骤 : 1 、创建一个远程接 口
式计算将 工作量分散到多个 J v a a虚拟机上。
2 实现远程对象( 务器端程序 ) 、 服 3 、生成 占位程 序和骨干网( 务器端 程序 ) 服 4 、编写服务 器程序 5 、编写客户程序
其主要功能是 :使用户能访 问在另一主机上的 Jv aa对象,并 远程调用其方法。程序的对象是客户 ,而远程对象是服务器。 远程对象也可以是另一个远程服务对象 的客户 。通过使用持 续性 ( 串行化和解 串行化) ,本地对象和原始类型值可以作为

RMI由浅入深

RMI由浅入深

RMI 由浅⼊深0x01、什么是RMIRMI(Remote Method Invocation)即Java 远程⽅法调⽤,RMI ⽤于构建分布式应⽤程序,RMI 实现了Java 程序之间跨JVM 的远程通信。

顾名思义,远程⽅法调⽤:客户端⽐如说是在⼿机,然后服务端是在电脑;同时都有java 环境,然后我要在⼿机端调⽤服务端那边的某个⽅法,这就是,远程⽅法调⽤;使⽤RMI 的时候,客户端对远程⽅法的调⽤就跟对同⼀个Java 虚拟机(也就是本地)上的⽅法调⽤是⼀样的。

⼀般调⽤和RMI 调⽤有⼀点不同,虽然对客户端来说看起来像是本地的,但是客户端的stub 会通过⽹络发出调⽤,所以会抛出异常;其中还是会涉及到Socket 和串流的问题,⼀开始是本地调⽤,然后就代理(stub )会转成远程,中间的信息是如何从Java 虚拟机发送到另外⼀台Java 虚拟机要看客户端和服务端的辅助设施对象所⽤的协议⽽定;使⽤RMI 的时候,需要选择协议:JRMP 或IIOP 协议;JRMP 是RMI 的原⽣的协议,也就是默认JRMP 协议。

⽽IIOP 是为了CORBA ⽽产⽣的~~~远程⽅法调⽤,具体怎么实现呢?远程服务器提供具体的类和⽅法,本地会通过某种⽅式获得远程类的⼀个代理,然后通过这个代理调⽤远程对象的⽅法,⽅法的参数是通过序列化与反序列化的⽅式传递的,所以,1. 只要服务端的对象提供了⼀个⽅法,这个⽅法接收的是⼀个Object 类型的参数2. 且远程服务器的classpath 中存在可利⽤pop 链,那么我们就可以通过在客户端调⽤这个⽅法,并传递⼀个精⼼构造的对象的⽅式来攻击rmi 服务。

某种⽅式获得远程对象的代理,那么具体是怎么的实现机制呢?RMI 模式中除了有Client 与Server,还借助了⼀个Registry(注册中⼼)。

其中Server 与Registry 可以在同⼀服务器上实现,也可以布置在不同服务器上,现在⼀个完整的RMI 流程可以⼤概描述为:Registry 先启动,并监听⼀个端⼝,⼀般为1099Server 向Registry 注册远程对象Client 从Registry 获得远程对象的代理(这个代理知道远程对象的在⽹络中的具体位置:ip 、端⼝、标识符),然后Client 通过这个代理调⽤远程⽅法,Server 也是有⼀个代理的,Server 端的代理会收到Client 端的调⽤的⽅法、参数等,然后代理执⾏对应⽅法,并将结果通过⽹络返回给Client 。

RMI一步一步学习

RMI一步一步学习
同样的,把这个文件保存在你的目录里然后编译他。
这个实现类使用了UnicastRemoteObject去联接RMI系统。在我们的例子中,我们是直接的从UnicastRemoteObject这个类上继承的,事实上并不一定要这样做,如果一个类不是从UnicastRmeoteObject上继承,那必须使用它的exportObject()方法去联接到RMI。
注意,这个接口继承自Remote,每一个定义的方法都必须抛出一个RemoteException异常对象。
建立这个文件,把它存放在刚才的目录下,并且编译。
>javac Calculator.java
2、接口的具体实现
下一步,我们就要写远程服务的具体实现,这是一个CalculatorImpl类文件:
基础教程之——RMI一步一步学习 10大城市2万个热门IT职位 注册有奖
JAVAV工程师权威认证
广州中星报MCSE送CCNA3600元 [广州]神州数码java就业培训
系统管理员 初级程序员 软件开发工程师
数据库工程师 高级项目经理 界面设计经理 ChinaItLab 佚名 2005-12-31 保存本文 推荐给好友 收藏本页 欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入
下面我们一步一步建立一个简单的RMI系统。首先在你的机器里建立一个新的文件夹,以便放置我们创建的文件,为了简单起见,我们只使用一个文件夹存放客户端和服务端代码,并且在同一个目录下运行服务端和客户端。
如果所有的RMI文件都已经设计好了,那么你需要下面的几个步骤去生成你的系统:
1、 编写并且编译接口的Java代码
如果一个类继承自UnicastRemoteObject,那么它必须提供一个构造函数并且声明抛出一个RemoteException对象。当这个构造函数调用了super(),它久激活UnicastRemoteObject中的代码完成RMI的连接和远程对象的初始化。

JAVA中最简单的分布式调用RMI

JAVA中最简单的分布式调用RMI

JAVA中最简单的分布式调用RMI 系统中目前存在两个JAVA 服务,分别是服务A、服务B。

现在服务A 想要调用服务B中的某个服务,我们怎么实现呢?有人觉得这不很简单,服务B暴露一个服务接口,服务A通过RPC 的方式来访问这个接口,这里的RPC 可以引用第三方实现,也可以通过简单的REST 请求的方式实现。

是的,解决这场景的方法有很多,其实JAVA 自身也提供了一种更简单的方式,即通过RMI 实现跨JVM 虚拟机的远程调用。

虽然它和现在主流的RPC 相比,可能显得比较无力。

但是其设计思想,加上它的简单易用,我们不妨来看一下。

RMI 简介RMI(Remote Method Invocation)是一种用于实现远程过程调用的应用程序编程接口。

它使客户机上运行的程序可以调用远程服务器上的对象。

远程方法调用特性使Java编程人员能够在网络环境中分布操作。

特点∙是JAVA 自带的功能,无需集成任何的外部扩展;∙数据传输是面向对象的;∙动态下载对象资源;∙仅限JAVA 间通信;通信协议服务间的通信通过TCP 传输。

协议约定为rmi://,仅限JAVA之间的远程通信;成员∙RMI Registry:作为存储远程服务的代理对象的仓库∙Server:服务端,暴露远程对象,并将其代理对象注册进RMI Registry∙Client:客户端,查找远程代理对象,远程调用服务对象运行机制从上图可以看出,虽然RMI 目前看上去有点过时了,但其思想和现在的服务注册与发现还是很相似的。

归纳起来,包含以下几点:1.启动注册中心2.服务端:暴露服务3.服务端:服务注册4.客户端:获取服务地址(代理对象)5.客户端:远程调用服务使用方法∙启动RMI Registry这里启动仓库有两种方式,一种是在程序中启动:import java.rmi.registry.LocateRegistry;Registry registry = LocateRegistry.createRegistry(REGISTRY_PORT);另一种通过命令启动:/usr/bin/rmiregistry REGISTRY_PORT∙获取RMI Registry∙通过环境变量java.rmi.server.hostname 来设置仓库地址import java.rmi.registry.LocateRegistry;Registry registry = LocateRegistry.getRegistry(REGISTRY_PORT)∙定义远程服务接口∙接口继承Remote∙接口方法必须抛出RemoteExceptionimport java.rmi.Remote;public interface RemoteService extends Remote { / /define your functionObject run() throws RemoteException;}∙UnicastRemoteObject.exportObject(Remote obj, int port)∙创建Remote 对象的代理类,并实现Serializable 接口∙在TCP 上暴露远程服务∙port 为0 表示使用匿名随机端口(使用1~1023的已知端口时,注意权限问题)import java.rmi.server.UnicastRemoteObject;Remote remoteProxy = UnicastRemoteObject.exportObject(your_remote_service, 0);∙注册远程对象到RMI Registry(在Registry 中的都是对象的远程代理类,并非真正的对象)获取Registry 的远程代理类,然后调用它的rebind 将代理对象注册进仓库中(Naming.rebind(String name, Remote obj) 本质上也是解析name 中的仓库地址,获取仓库的代理对象,进而进行远程注册)// 本地创建或远程获取 RegistryRegistry registry = ...registry.rebind(String name, Remote obj);∙查找远程调用对象Registry registry = LocateRegistry.getRegistry(REGISTRY_PORT);Remote obj = registry.lookup(REMOTE_NAME);示例###准备工作:定义远程对象接口package com.test.remote;import java.rmi.Remote;import java.rmi.RemoteExcept ion;public interface RemoteService extends Remote { Object run() throws RemoteException; Object run(Object obj) throws RemoteException;}###服务B:注册远程服务∙实现远程服务对象package com.test.serviceB.publishService;import com.test.remote.RemoteServi ce;import java.rmi.RemoteException;public class pService1 implements RemoteService { public Object run() {System.out.println("invoke pService1."); return "success"; } public Object run(Object obj) throws RemoteException {System.out.println("invoke pService1, params is " + obj.toString ()); return "success";}}∙启动服务∙创建RMI Registry(也可在通过命令rmiregistry 在应用外创建)∙实例化远程服务∙导出远程对象,使其能接受远程调用∙将导出的远程对象绑定到仓库中∙等待服务调用public class Boot { private static final String REMOTE_P1 = "serviceB:p1 "; private static final int REGISTRY_PORT = 9999; public static voi d main(String[] args) throws RemoteException {// 实例化远程对象,并创建远程代理类RemoteService p1 = new pService1();Remote stub1 = UnicastRemoteObject.exportObject(p1, 0);// 本地创建 Registry,并注册远程代理类Registry registry = LocateRegistry.createRegistry(REGISTRY_PORT); registry.rebind(REMOTE_P1, stub1);System.out.println("service b bound");}}###服务A:调用远程服务∙启动服务∙连接仓库∙在Registry 中查找所调用服务的远程代理类∙调用代理类方法public class Boot { private static final String REMOTE_P1 = "serviceB:p1 "; private static final int REGISTRY_PORT = 9999; public static void main(String[] args) throws RemoteException { try {Registry registry = LocateRegistry.getRegistry(REGISTRY_POR T); // 从仓库中获取远程代理类RemoteService p1 = (RemoteService) registry.lookup(REMOTE_P 1); // 远程动态代理String res1 = (String)p1.run();System.out.printf("The remote call for %s %s \n", REMOTE_P1, re s1);} catch (NotBoundException e){e.printStackTrace();} catch (RemoteException e){e.printStackTrace();}}}演示结果∙启动服务Bservice b bound∙启动服务AThe remote call for serviceB:p1 successProcess finished with exit code 0∙查看服务B 调用情况service b boundinvoke pService1.高级用法上面示例没有涉及到远程调用的传参问题。

RMI系统原理及使用方法

RMI系统原理及使用方法

RMI系统原理及使用方法论文导读:Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力上,而RMI就是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一。

关键词:RMI,JAVA,分布式远程方法调用Java RMI(RomoteMethod Invocation 远程方法调用)是用Java在JDK1.1中实现的,它大大增强了Java开发分布式应用的能力。

其实它可以被看作是RPC的Java版本。

但是传统RPC并不能很好地应用于分布式对象系统。

而Java RMI则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。

RMI目前使用Java远程消息交换协议JRMP(Java Remote Messaging Rrotocol)进行通信。

JRMP是专为Java的远程对象制定的协议。

因此,Java RMI具有Java的”Write Once,Run Anywhere”的优点,是分布式应用系统的百分之百纯Java解决方案。

用Java RMI开发的应用系统可以部署在任何支持JRE的平台上。

发表论文。

但由于JRMP是专为Java对象制定的,因此,RMI对用用非Java语言开发的应用系统的支持不足。

不能与用非Java语言书写的对象进行通信。

RMI系统原理RMI应用程序通常包括两个独立的程序:服务器程序和客户机程序。

典型的服务器应用程序将创建多个远程对象,使这些远程对象能够被引用,然后等待客户机调用这些远程对象的方法。

而典型的客户机程序则从服务器中得到一个或多个远程对象的引用,然后调用远程对象的方法。

RMI为服务器和客户机进行通信和信息传递提供了一种机制。

在与远程对象的通信过程中,RMI使用标准机制:Stub和Skeleton。

远程对象的Stub担当远程对象的客户本地代表或代理人角色。

发表论文。

调用程序将调用本地Stub的方法,而本地Stub将负责执行对远程对象的方法调用。

RMI和socket详解

RMI和socket详解

RMI和socket详解⼀般来说,基于CS(client-server)软件架构的开发技术有很多种。

⽐较常⽤的有:基于socket的⽹络编程、RPC、基于Java技术的RMI(当然C#也有类似技术)、CORBA 等。

在这⾥我们只是对基于socket的⽹络编程与RMI作个对⽐,有助于我们了解它们各⾃的应⽤领域,帮助我们在⾯对⼀个具体问题的时候选⽤适合的技术。

另外,本⽂所做的讨论可以认为是脱离了语⾔层⾯的东西,只是对技术的本⾝做⼀个讨论,⽆关乎你是⽤C++、C#或Java 在开发。

⼀、RMI技术简介本⽂就以Java为例,简单介绍⼀下RMI技术。

从Java1.1开始,远程⽅法调⽤作为Java分布式对象技术成为Java核⼼的API之⼀(在java.rmi.* 包)。

RMI的引⼊,使得Java程序之间能够实现灵活的,可扩展的分布式通信。

RMI允许Java对象存在于多个不同的地址空间,分布在不同的Java虚拟机上。

每⼀个地址空间可以在同⼀台主机上或者⽹络上不同的计算机上。

由于远程⽅法调⽤跨越不同的虚拟机边界到不同的指定的地址空间,所以没有对象共享的全局变量,这就需要对象序列化(Object Serialization)API,它使得Java对象能够在不同的JVM之间传递。

对象序列化是特别为Java的对象设计的,这就意味着Java程序中的对象可以作为对象参数存取(可序列化的对象必须实现Serializable接⼝)。

结合RMI和对象序列化机制,就可以访问越过本地Java虚拟机边界的对象以及数据。

通过RMI,可以调⽤远程对象的远程⽅法,⽽通过Java对象序列化机制可以将对象传递给这些⽅法。

最基本的Java模型并没有提供将远程主机上的Java对象看作本地Java程序地址空间⼀部分的能⼒,⽽RMI祢补了这⼀不⾜。

另外,由于Java与硬件平台⽆关的特性,⽆论是同构的系统还是异构的系统,RMI不需移植就可以顺利运⾏。

RMI为Java平台的分布式计算提供了⼀个简单⽽直接的模型。

JavaRMI使用例子

JavaRMI使用例子

JavaRMI使⽤例⼦1.创建协议接⼝(UserService)/****/package com.junge.demo.rmi.protocol.service;import java.io.Serializable;import java.rmi.Remote;import java.rmi.RemoteException;import er;/*** @author Administrator**/public interface UserService extends Remote, Serializable {Integer addUser(User user) throws RemoteException;void delUser(Integer userid) throws RemoteException;void modifyUser(User user) throws RemoteException;User getUserByUserId(Integer userid) throws RemoteException;}User.java/****/package com.junge.demo.rmi.protocol.model;import java.io.Serializable;/*** @author Administrator**/public class User implements Serializable {/****/private static final long serialVersionUID = -8967262939434460765L;private Integer userid;private String username;public Integer getUserid() {return userid;}public void setUserid(Integer userid) {erid = userid;}public String getUsername() {return username;}public void setUsername(String username) {ername = username;}@Overridepublic String toString() {return "User [userid=" + userid + ", username=" + username + "]";}}2、创建服务实现类UserServiceProvider.javapackage com.junge.demo.rmi.server.service.provider;import java.rmi.RemoteException;import java.rmi.server.UnicastRemoteObject;import er;import erService;public class UserServiceProvider extends UnicastRemoteObject implements UserService {/****/private static final long serialVersionUID = 1L;public UserServiceProvider() throws RemoteException {super();}public Integer addUser(User user) throws RemoteException {System.out.println("addUser:" + user);return user.getUserid();}public void delUser(Integer userid) throws RemoteException {System.out.println("delUser,userid=" + userid);}public void modifyUser(User user) throws RemoteException {System.out.println("modifyUser:" + user);}public User getUserByUserId(Integer userid) throws RemoteException {System.out.println("getUserByUserId,userid={}" + userid);User user = new User();user.setUserid(userid);user.setUsername("寮犱笁");return user;}}3.启动注册表,注册服务(ServiceStartServlet.java)/****/package com.junge.demo.rmi.server.service.start;import java.rmi.RemoteException;import java.rmi.registry.LocateRegistry;import java.rmi.registry.Registry;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import com.alibaba.fastjson.JSONObject;import erServiceProvider;/*** @author Administrator**/public class ServiceStartServlet extends HttpServlet {private static final long serialVersionUID = 1L;private Registry registry;private static final String BIND_NAME = "erService"; private Registry getRegistry() throws RemoteException {return LocateRegistry.createRegistry(1099);}@Overridepublic void init() throws ServletException {try {registry = getRegistry();System.out.println(JSONObject.toJSON(registry.list()));registry.rebind(BIND_NAME, new UserServiceProvider());} catch (RemoteException e) {e.printStackTrace();}}@Overridepublic void destroy() {if (null != registry) {try {registry.unbind(BIND_NAME);} catch (Exception e) {e.printStackTrace();}}}}4.创建客户端调⽤rmi(RmiClient.java)/****/package com.junge.demo.rmi;import java.rmi.Naming;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;import er;import erService;/*** @author Administrator**/public class RmiClient {/*** @param args*/public static void main(String[] args) {addUserBatch();}public static void addUserBatch() {Long btime = System.currentTimeMillis();ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 1000, 200L, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(50000));try {UserService userService = (UserService)Naming.lookup("erService");for (int i = 0; i < 50000; i++) {executor.submit(new OperUser(userService));}} catch (Exception e) {e.printStackTrace();} finally {executor.shutdown();}Long etime = System.currentTimeMillis();System.out.println(etime - btime);}}class OperUser implements Runnable {private UserService userService;public OperUser(UserService userService) {erService = userService;}@Overridepublic void run() {try {// 增加、详情、修改、删除User user = new User();user.setUserid(1);user.setUsername("名字");userService.addUser(user);User user2 = userService.getUserByUserId(1);userService.modifyUser(user2);userService.delUser(user2.getUserid());} catch (Exception e) {e.printStackTrace();}}}5.注意实现a.协议接⼝需要继承Remote接⼝,对外提供的接⼝需要抛出RemoteException异常b.协议接⼝中使⽤的对象需要实现序列化接⼝Serializablec.服务端实现类需要继承UnicastRemoteObject类6.问题1.使⽤maven⼯程创建的服务端,直接使⽤java application运⾏服务端,找不到协议接⼝。

java RMI 详解

java RMI 详解

第6章 JAVA RMI6.1 客户与服务器的角色客户计算机在本地收集信息,然后通过网络将信息发送给服务器.例下图5-1在传统的客户/服务器(c/s)模型中,客户端将请求翻译成某种中间传输格式,然后将请求发送给服务器.服务器解析该请求,通过运算得到响应,再将响应格式化并传递给客户,然后客户端解析响应并将它呈现给用户.➢在这个过程中会遇到什么问题呢?在上述过程中如果手动实现这些步骤,将会遇到编码问题,因为在传输的过程中要求设计一种传输格式,同时还必须为数据和传输格式之间的转换而编码.为了解决这个问题,我们就想是否有一种机制,能够实现客户端程序员以常规的方式进行方法调用,而无需操心数据在网络上传输或者解析响应之类的问题.但问题在于,提供服务的对象可能不能在同一个虚拟机内,甚至它可能不是java语言实现的对象。

解决的办法是,在客户端为服务器对象安装一个代理,客户进行调用此代理,进行常规的方法调用,而客户端代理负责与服务器进行联系。

同样,在服务器端安装第二个代理。

如下图5-2代理之间的通信是通过规定的技术来实现。

通常有三种选择:◆RMI,Java的远程方法调用技术,支持Java的分布式对象之间的方法调用。

◆CORBA,通用对象请求代理架构,支持任何编程语言编写的对象之间的方法调用。

CORBA使用Internet Inter-ORB协议(IIOP)支持对象间的通信。

◆SOAP,简单对象访问协议,它也独立于编程语言。

不过SOAP使用基于XML的传输格式。

CORBA与SOAP都是完全独立于语言的。

客户端于服务器程序可以由C、C++、Java或其他语言编写。

你只需要提供一个接口描述(interface desciption),以说明你的对象能够处理方法的签名与数据类型。

该接口描述是用一种特殊的语言编写的,对于CORBA来说是接口定义语言(IDL),对于SOAP而言则是Web服务描述语言(WSDL);相比较而言,CORBA更高效,而SOAP更适合于Web架构的系统。

java远程通讯技术及简单实现

java远程通讯技术及简单实现

java远程通讯技术及简单实现在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java底层领域中有很多可实现远程通讯的技术,例如:RMI、MINA、ESB、Burlap、SOAP、EJB和JMS 等,在j2ee中,对java底层远程通讯的技术进行了封装,形成了Hessian 、HttpInvoker 、XFire 、Axis 等多种形式的远程调用技术。

但对高级程序员而言仍需要掌握Java底层领域中远程通讯的技术,尤其是rmi,xml-rpc,JMS。

1.远程服务基本原理1)底层协议要实现网络机器间的通讯,首先得来看看计算机系统网络通信的基本原理,在底层层面去看,网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络IO来实现,其中传输协议比较出名的有http、tcp、udp等等,http、tcp、udp都是在基于Socket概念上为某类应用场景而扩展出的传输协议,网络IO,主要有bio、nio、aio三种方式,所有的分布式应用通讯都基于这个原理而实现,只是为了应用的易用,各种语言通常都会提供一些更为贴近应用易用的应用层协议。

2)应用级协议远程服务通讯,需要达到的目标是在一台计算机发起请求,另外一台机器在接收到请求后进行相应的处理并将结果返回给请求端,这其中又会有诸如one way request、同步请求、异步请求等等请求方式,按照网络通信原理,需要实现这个需要做的就是将请求转换成流,通过传输协议传输至远端,远端计算机在接收到请求的流后进行处理,处理完毕后将结果转化为流,并通过传输协议返回给调用端。

在java领域中知名的远程通信的应用级协议有:RMI、XML-RPC、Binary-RPC、SOAP、JMS2.RMI2.1RMI原理RMI,即Java RMI(Java Remote Method Invocation),Java远程方法调用.是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。

RMI原理及实现

RMI原理及实现
象,它就象服务器上的对象的代理,向客户端提供能够被服务器调用的方法。然后,Stub 就会向服务器端的 Skeleton 发送方法调用,Skeleton 就会在服务器端执行接收到的方法。
Stub 和 Skeleton 之间通过远程调用层进行相互通讯,远程调用层遵循 TCP/IP 协议收发 数据。下面我们来大致了解一种称为为“绑定”的技术。
?远程客户端:这是一个帮助我们访问远程方法提供帮助的类,它也是最终用户。 我们将使用查找和调用远程方法的方法在该类中调用远程方法。
编程 我们将首先编写远程对象,并将代码保存为名字为 AddServer.Java 的文件: import Java.rmi.*; public interface AddServer extends Remote { public int AddNumbers(int firstnumber,int secondnumber) throws RemoteException; } 我们来看看上面的代码。首先,为了使用其内容,我们导入 rmi 包。然后,我们创
C:\jdk\bin\Javac workingdir\RmiClient.Java 在对我们的代码进行测试前,还必须首先启动 RMI Registry。RMI Registry 存储有 所有绑定的数据,没有它,RMI 就不能正常地运行! 启动 Rmi Registry 服务器: C:\jdk\bin\start rmiregistry 我们会注意到,这时会出现一个空白的 DOS 提示符窗口,这表明 Rmi Registry 服 务器在运行,注意不要关闭该窗口。然后,我们首先在一个 DOS 提示符窗口中运行 Rmi 服 务器,然后在另一个 DOS 提示符窗口中运行 Rmi 客户端。 启动 RMI 服务器:

java_RMI技术讲解

java_RMI技术讲解

RMI技术讲解1、什么是RMI?我们知道远程过程调用(Remote Procedure Call, RPC)可以用于一个进程调用另一个进程(很可能在另一个远程主机上)中的过程,从而提供了过程的分布能力。

Java 的RMI 则在RPC 的基础上向前又迈进了一步,即提供分布式对象间的通讯。

RMI(Remote Method Invocation)为远程方法调用,是允许运行在一个Java虚拟机的对象调用运行在另一个Java虚拟机上的对象的方法。

这两个虚拟机可以是运行在相同计算机上的不同进程中,也可以是运行在网络上的不同计算机中。

2、RMI的用途?RMI的用途是为分布式Java应用程序之间的远程通信提供服务,提供分布式服务。

目前主要应用时封装在各个J2EE项目框架中,例如Spring,EJB(Spring和EJB均封装了RMI技术)在Spring中实现RMI(具体代码见最后一页)①在服务器端定义服务的接口,定义特定的类实现这些接口;②在服务器端使用org.springframework.remoting.rmi.RmiServiceExporter类来注册服务;③在客户端使用org.springframework.remoting.rmi.RmiProxyFactoryBean来实现远程服务的代理功能;④在客户端定义访问与服务器端服务接口相同的类3、RMI的局限?RMI目前使用Java远程消息交换协议JRMP(Java Remote Messaging Protocol)进行通信。

JRMP是专为Java的远程对象制定的协议,由于JRMP是专为Java对象制定的,因此,RMI对于用非Java语言开发的应用系统的支持不足。

不能与用非Java语言书写的对象进行通信(意思是只支持客户端和服务器端都是Java程序的代码的远程调用)。

4、RMI的使用局限?由于客户机和服务器都是使用Java编写的,二者平台兼容性的要求仅仅是双方都运行在版本兼容的Java虚拟机上。

分布式计算与RMI

分布式计算与RMI

21
一个RMI应用程序示例 应用程序示例 一个
4.其它一些工作 . 5. 运行程序
22
17
一个RMI应用程序示例 应用程序示例 一个
1. 构造一个远程接口 . 构造一个远程接口Hello: :
package hello; public interface Hello extends java.rmi.Remote { //rmi应用程序必须继承自java.rmi.Remote String sayHello() throws java.rmi.RemoteException ; //定义可以远程调用的接口 }
一个RMI应用程序示例 应用程序示例 一个
ቤተ መጻሕፍቲ ባይዱ3. 完成 . 完成client方程序 方程序
package hello; import java.rmi.*; public class HelloClient { public static void main(String args[]) { System.setSecurityManager(new RMISecurityManager() ); //设置RMI需要的安全策略 try { Hello obj = (Hello) Naming.lookup("HelloServer"); //从服务端获得一个Hello的远程对象 String message = obj.sayHello(); //远程调用Hello的方法 System.out.println(message); //将输出结果打印 } catch (Exception e) { System.out.println("Hello client : an exception occured"); e.printStackTrace(); //若有异常,输出异常信息 } } }

Java分布式处理技术

Java分布式处理技术

Java分布式处理技术Java 分布式处理技术Java分布式处理技术(RMI,JDNI) 收藏Java 分布式处理技术1.1 RMI 的基本概念1.1.1 什么是RMIRMI(Remote Method Invocation) 远程方法调用是一种计算机之间对象互相调用对方函数,启动对方进程的一种机制,使用这种机制,某一台计算机上的对象在调用另外一台计算机上的方法时,使用的程序语法规则和在本地机上对象间的方法调用的语法规则一样。

1.1.2 RMI 的用途1、分布式体系结构我们为什么要使用分布式计算呢?当我们想与多个用户或客户机共享一个中央资源(如一个数据库)时,就会使用分布式计算。

分布式计算用来利用多个系统的组合计算能力,以便比在单个系统上更有效或更快地解决问题。

可以用多种方法配置多个计算机系统以共享处理,包括共享内存、共享磁盘或只是共享一条公共通信通道。

最新的技术允许物理上相隔很远的系统能够在处理计算问题时协同工作。

关于利用计算能力这一主题,因特网及伴随的通信协议TCP/IP 的出现已使无数的计算机系统史无前例地连接起来。

对一些应用程序来说,能够利用如此多的计算功能来解决问题是令人满意的。

甚至更吸引人的是,大多数计算机系统都有充足的空闲时间,可以帮助解决其它问题。

将来,网格计算会利用分布式计算能力进行出售,这与电力行业出售电能非常相似。

2、Java 分布式对象编程技术RMI 是Enterprise JavaBeans 的支柱,是建立分布式Java 应用程序的方便途径。

只要按照RMI 规则设计程序,可以不必再过问在RMI 之下的网络细节了,如:TCP 和Socket 等等。

任意两台计算机之间的通讯完全由RMI 负责。

调用远程计算机上的对象就像本地对象一样方便。

1.1.3 RMI 应用程序分类Java 分布式处理技术依据RMI 应用程序各部分职责,可对应用程序进行如下分类:服务器程序:服务器程序将创建多个远程对象,并使每个对象能够被引用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java分布式之RMI实例教程网络通信原理前言最近的联通项目,下一阶段可能会涉及到和各省间的RMI接口,所以总结一下08年中国移动自动拨测系统用到的RMI技术,以备不时之需。

同时也给广大初哥提供一些学习资料,哈哈。

前几年,一直忙于项目,没怎么做系统总结。

以后计划写一些以前项目用过的Java 分布式技术实例教程,如:RMI、Socket、Mina、SNMP、SOAP、Web Service、Hessian、JMS 等。

希望和大家一起交流,分享经验,一起提高。

RMI简介RMI,远程方法调用(Remote Method Invocation)是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。

RMI是非常容易使用的,但是它非常的强大。

RMI的基础是接口,RMI构架基于一个重要的原理:定义接口和定义接口的具体实现是分开的。

看看jboss-remoting:基本原理要实现网络机器间的通讯,首先得来看看计算机系统网络通信的基本原理,在底层层面去看,网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络IO 来实现,其中传输协议比较出名的有http、tcp、udp等等,http、tcp、udp都是在基于Socket 概念上为某类应用场景而扩展出的传输协议,网络IO,主要有bio、nio、aio三种方式,所有的分布式应用通讯都基于这个原理而实现,只是为了应用的易用,各种语言通常都会提供一些更为贴近应用易用的应用层协议。

主要步骤分为以下几个步骤:1. 创建远程接口及声明远程方法(RmiMonitorService.java)2. 实现远程接口及远程方法(继承UnicastRemoteObject)(RmiMonitorServiceImpl.java)3. 启动RMI注册服务,并注册远程对象(RmiServer.java)4. 客户端查找远程对象,并调用远程方法(MonitorClient.java)5. 运行实例业务场景在移动拨测系统管理端中要融合实时显示。

简单点说就是设备出现告警时,要采用不同方式实时展示。

如Web界面(Ajax)、GIS等。

主要业务流程设计:1. 设备告警2. 调用RMI Client3. 调用RMI Server4. 调用业务处理接口5. 告警信息入库6. 实时显示(Ajax,Gis等技术)技术设计接口函数函数名称:int interactive(int funindex,string param )参数说明:funindex 功能号,整型。

1为设备告警param 交互参数,字符串型。

返回:成功=1,失败=0。

说明:param交互参数用键值对组成,每个键值对以“&”分割,如:Tsid=01&devid=002&warnid=102&warntype=01&warnlevel=1 。

测试点ID(tsid)设备ID(devid)告警ID(warnid)告警类型(warntype)告警级别(warnlevel)代码实现废话少说,上代码,为了演示方便,经过整理,省去了很多get,set之类的东东还有业务的东西以及Spring相关的东西。

Java代码RmiMonitorService.javapackage nbpt.ts.manager.message.service;import java.rmi.Remote;import java.rmi.RemoteException;/*** Description:实时显示RMI服务接口。

** RMI接口必须扩展接口java.rmi.Remote** @author Peter Wei* @version 1.0 Feb 25,2009*/public interface RmiMonitorService extends Remote {/*** 实时显示对外接口** @param funindex* 功能号* @param param* 键名列表,也就是实际传输的内容* @return* @throws RemoteException* 远程接口方法必须抛出java.rmi.RemoteException*/public int interactive(int funindex,String param)throws RemoteException;}RmiMonitorServiceImpl.javapackage nbpt.ts.manager.message.service.impl;import java.rmi.RemoteException;import java.rmi.server.UnicastRemoteObject;// import nbpt.ts.manager.base.util.AppContext;import nbpt.ts.manager.message.service.RmiMonitorService;import nbpt.ts.manager.message.service.WarnService;/*** Description:实时显示RMI接口实现。

** 实现RMI接口及远程方法(继承UnicastRemoteObject)** @author Peter Wei* @version 1.0 Feb 25,2009*/public class RmiMonitorServiceImpl extends UnicastRemoteObject implements RmiMonitorService {private static final long serialVersionUID = -3771656108378649574L;public static final int SUCCSS = 1;public static final int FAIL = 0;public WarnService warnService;/*** 必须定义构造方法,因为要抛出RemoteException异常** @throws RemoteException*/public RmiMonitorServiceImpl()throws RemoteException {super();}public int interactive(int funindex,String param)throws RemoteException { int result = FAIL;switch (funindex){// 告警case (1):{// warnService = (WarnService)AppContext.getAppContext().getBean(// “warn.warnService”);// 实际应用是从Spring应用中获取告警Service,如上代码warnService = new WarnServiceImpl();// 网络告警的业务操作warnService.dealWarn(param);result = SUCCSS;}break;case (2):// do other bizbreak;}// 。

..。

..return result;public WarnService getWarnService(){return warnService;}public void setWarnService(WarnService warnService){this.warnService = warnService;}}RmiServer.javapackage nbpt.ts.manager.message.service;import .MalformedURLException;import java.rmi.AlreadyBoundException;import java.rmi.Naming;import java.rmi.RemoteException;import java.rmi.registry.LocateRegistry;import nbpt.ts.manager.message.service.impl.RmiMonitorServiceImpl;/*** Description:RMI服务端。

** @author Peter Wei* @version 1.0 Feb 25,2009*/public class RmiServer {public String ip = “localhost”;public int port = 8889;/*** 启动RMI注册服务,并注册远程对象。

实际应用中是在Spring初始化并启动*/public void init(){try {LocateRegistry.createRegistry(port);// 创建一个远程对象RmiMonitorService comm = new RmiMonitorServiceImpl();Naming.bind(“//” + ip + “:” + port + “/comm”,comm);} catch (RemoteException e){System.out.println(“创建远程对象发生异常!” + e.toString());e.printStackTrace();} catch (AlreadyBoundException e){System.out.println(“发生重复绑定对象异常!” + e.toString());e.printStackTrace();} catch (MalformedURLException e){System.out.println(“发生URL畸形异常!” + e.toString());e.printStackTrace();}public String getIp(){return ip;}public void setIp(String ip){this.ip = ip;}public int getPort(){return port;}public void setPort(int port){this.port = port;}public static void main(String[]args){// 实际应用中是在Spring初始化并启动RmiServer rmiServer = new RmiServer();System.out.println(“R MI服务初始化:”); rmiServer.init();}}MonitorClient.javapackage nbpt.ts.manager.message.service;import .MalformedURLException;import java.rmi.Naming;import java.rmi.NotBoundException;import java.rmi.RemoteException;/*** Description:RMI客户端。

相关文档
最新文档