当前位置:文档之家› RMI,远程方法调用(Remote Method Invocation)

RMI,远程方法调用(Remote Method Invocation)

RMI,远程方法调用(Remote Method Invocation)
RMI,远程方法调用(Remote Method Invocation)

RMI,远程方法调用(Remote Method Invocation)是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。RMI是非常容易使用的,但是它非常的强大。

RMI的基础是接口,RMI构架基于一个重要的原理:定义接口和定义接口的具体实现是分开的。下面我们通过具体的例子,建立一个简单的远程计算服务和使用它的客户程序

一个正常工作的RMI系统由下面几个部分组成:

●远程服务的接口定义

●远程服务接口的具体实现

●桩(Stub)和框架(Skeleton)文件

●一个运行远程服务的服务器

●一个RMI命名服务,它允许客户端去发现这个远程服务

●类文件的提供者(一个HTTP或者FTP服务器)

●一个需要这个远程服务的客户端程序

下面我们一步一步建立一个简单的RMI系统。首先在你的机器里建立一个新的文件夹,以便放置我们创建的文件,为了简单起见,我们只使用一个文件夹存放客户端和服务端代码,并且在同一个目录下运行服务端和客户端。

如果所有的RMI文件都已经设计好了,那么你需要下面的几个步骤去生成你的系统:

1、编写并且编译接口的Java代码

2、编写并且编译接口实现的Java代码

3、从接口实现类中生成桩(Stub)和框架(Skeleton)类文件

4、编写远程服务的主运行程序

5、编写RMI的客户端程序

6、安装并且运行RMI系统

1、接口

第一步就是建立和编译服务接口的Java代码。这个接口定义了所有的提供远程服务的功能,下面是源程序:

//Calculator.java

//define the interface

import java.rmi.Remote;

public interface Calculator extends Remote

{

public long add(long a, long b)

throws java.rmi.RemoteException;

public long sub(long a, long b)

throws java.rmi.RemoteException;

public long mul(long a, long b)

throws java.rmi.RemoteException;

public long div(long a, long b)

throws java.rmi.RemoteException;

}

注意,这个接口继承自Remote,每一个定义的方法都必须抛出一个RemoteException异常对象。

建立这个文件,把它存放在刚才的目录下,并且编译。

>javac Calculator.java

2、接口的具体实现

下一步,我们就要写远程服务的具体实现,这是一个CalculatorImpl类文件://CalculatorImpl.java

//Implementation

import java.rmi.server.UnicastRemoteObject

public class CalculatorImpl extends UnicastRemoteObject implements Calculator

{

// 这个实现必须有一个显式的构造函数,并且要抛出一个RemoteException 异常

public CalculatorImpl()

throws java.rmi.RemoteException {

super();

}

public long add(long a, long b)

throws java.rmi.RemoteException {

return a + b;

}

public long sub(long a, long b)

throws java.rmi.RemoteException {

return a - b;

}

public long mul(long a, long b)

throws java.rmi.RemoteException {

return a * b;

}

public long div(long a, long b)

throws java.rmi.RemoteException {

return a / b;

}

}

同样的,把这个文件保存在你的目录里然后编译他。

这个实现类使用了UnicastRemoteObject去联接RMI系统。在我们的例子中,我们是直接的从UnicastRemoteObject这个类上继承的,事实上并不一定要这样做,如果一个类不是从UnicastRmeoteObject上继承,那必须使用它的exportObject()方法去联接到RMI。

如果一个类继承自UnicastRemoteObject,那么它必须提供一个构造函数并且声明抛出一个RemoteException对象。当这个构造函数调用了super(),它久激活UnicastRemoteObject中的代码完成RMI的连接和远程对象的初始化。3、桩(Stubs)和框架(Skeletons)

下一步就是要使用RMI编译器rmic来生成桩和框架文件,这个编译运行在远程服务实现类文件上。

>rmic CalculatorImpl

在你的目录下运行上面的命令,成功执行完上面的命令你可以发现一个Calculator_stub.class文件,如果你是使用的Java2SDK,那么你还可以发现Calculator_Skel.class文件。

4、主机服务器

远程RMI服务必须是在一个服务器中运行的。CalculatorServer类是一个非常简单的服务器。

//CalculatorServer.java

import java.rmi.Naming;

public class CalculatorServer {

public CalculatorServer() {

try {

Calculator c = new CalculatorImpl();

Naming.rebind("rmi://localhost:1099/CalculatorService", c);

} catch (Exception e) {

System.out.println("Trouble: " + e);

}

}

public static void main(String args[]) {

new CalculatorServer();

}

}

建立这个服务器程序,然后保存到你的目录下,并且编译它。

5、客户端

客户端源代码如下:

//CalculatorClient.java

import java.rmi.Naming;

import java.rmi.RemoteException;

import https://www.doczj.com/doc/147570850.html,.MalformedURLException;

import java.rmi.NotBoundException;

public class CalculatorClient {

public static void main(String[] args) {

try {

Calculator c = (Calculator)

Naming.lookup(

"rmi://localhost

/CalculatorService");

System.out.println( c.sub(4, 3) );

System.out.println( c.add(4, 5) );

System.out.println( c.mul(3, 6) );

System.out.println( c.div(9, 3) );

}

catch (MalformedURLException murle) {

System.out.println();

System.out.println(

"MalformedURLException");

System.out.println(murle);

}

catch (RemoteException re) {

System.out.println();

System.out.println(

"RemoteException");

System.out.println(re);

}

catch (NotBoundException nbe) {

System.out.println();

System.out.println(

"NotBoundException");

System.out.println(nbe);

}

catch (

https://www.doczj.com/doc/147570850.html,ng.ArithmeticException

ae) {

System.out.println();

System.out.println(

"https://www.doczj.com/doc/147570850.html,ng.ArithmeticException");

System.out.println(ae);

}

}

}

保存这个客户端程序到你的目录下(注意这个目录是一开始建立那个,所有的我们的文件都在那个目录下),并且编译他。

6、运行RMI系统

现在我们建立了所有运行这个简单RMI系统所需的文件,现在我们终于可以运行这个RMI系统啦!来享受吧。

我们是在命令控制台下运行这个系统的,你必须开启三个控制台窗口,一个运行服务器,一个运行客户端,还有一个运行RMIRegistry。

首先运行注册程序RMIRegistry,你必须在包含你刚写的类的那么目录下运行这个注册程序。

>rmiregistry

好,这个命令成功的话,注册程序已经开始运行了,不要管他,现在切换到另外一个控制台,在第二个控制台里,我们运行服务器CalculatorService,因为RMI 的安全机制将在服务端发生作用,所以你必须增加一条安全策略。以下是对应安全策略的例子

grant {

permission java.security.AllPermission "", "";

};

注意:这是一条最简单的安全策略,它允许任何人做任何事,对于你的更加关键性的应用,你必须指定更加详细安全策略。

现在为了运行服务端,你需要除客户类(CalculatorClient.class)之外的所有的

类文件。确认安全策略在policy.txt文件之后,使用如下命令来运行服务器。

> java -Djava.security.policy=policy.txt CalculatorServer

这个服务器就开始工作了,把接口的实现加载到内存等待客户端的联接。好现在切换到第三个控制台,启动我们的客户端。

为了在其他的机器运行客户端程序你需要一个远程接口(Calculator.class) 和一个stub(CalculatorImpl_Stub.class)。使用如下命令运行客户端

prompt> java -Djava.security.policy=policy.txt CalculatorClient

如果所有的这些都成功运行,你应该看到下面的输出:

1

9

18

3

如果你看到了上面的输出,恭喜你,你成功了,你已经成功的创建了一个RMI系统,并且使他正确工作了。即使你运行在同一个计算机上,RMI还是使用了你的网络堆栈和TCP/IP去进行通讯,并且是运行在三个不同的Java虚拟机上。这已经是一个完整的RMI系统。

常见问题

虽然上叙RMI实例简单但是实际调试运行确碰到不少问题.相信不少初学RMI的朋友有同样的问题.

1、编译成功,但是运行Server找不到****_stub类

其实这个时候,找不到XXX_stub.class文件的不是你的Server,而是rmiregistry 程序。你的classpath里当然是有相应录的,但是rmiregistry起动时的路径里可没有。

(1)可以在start rmiregistry前

set CLASSPATH=.;E:\yourpath一下,然后再执行start rmiregistry

这样后,再执行服务程序

然后再执行客户端程序,就可以了。。。

(2)或者是在你起动RMI server时加codebase参数,如下:

java

-Djava.rmi.server.codebase=http://YourServerName/YourPackagePathName/ packageName.serverClassName

而你的Web Server的YourServerName/YourPackagePathName/目录下应该有一个与你的包同名的目录,那个目录下有相应stub文件。这个问题就圆满解决了。

2、RMI客户端连不上服务器,报java.security.AccessControlException错

可能就是安全策略问题了

我们运行服务器CalculatorService,因为RMI的安全机制将在服务端发生作用,

所以你必须增加一条安全策略。以下是对应安全策略的例子

grant {

permission java.security.AllPermission "", "";

};

注意:这是一条最简单的安全策略,它允许任何人做任何事,对于你的更加关键性的应用,你必须指定更加详细安全策略。

现在为了运行服务端,你需要除客户类(CalculatorClient.class)之外的所有的类文件。确认安全策略在policy.txt文件之后,使用如下命令来运行服务器。> java -Djava.security.policy=policy.txt CalculatorServer

这个服务器就开始工作了。

客户端加上System.setSecurityManager(new RMISecurityManager());

服务器端需要的文件:CalculatorImpl.class Calculator.class

客户端需要的文件:Calculator.class 根据CalculatorImpl.class生成的CalculatorImpl_stub.class

第六章 远程服务调用和Service Locator

第六章远程服务调用和Service Locator 1.什么是Websharp Service Locator 当今大部分的企业应用都是分布式的,单机版的软件虽然仍旧有很多,但是,在考虑一个完整的应用软件系统框架的时候,总是需要考虑完整的情况。多层分布式应用软件的开发原则和技术通常也是适用于单机版软件的。 对于多层的应用系统来说,我们通常把它们划分成客户端、应用服务层和数据库。在应用服务层,我们需要考虑至少两个方面的问题: ?如何实现业务逻辑 ?如何向客户端提供服务。 我们可能使用多种技术来实现服务的提供:Webservice、.Net Remoting、甚至EJB等。如此多的实现技术,带来的很大的灵活性,但同时也带来了文题,其中一个就是,有多少种服务端技术,就得有多少种相应的客户端访问技术。甚至,在某些分布式应用系统中,应用逻辑使用不同的技术开发,存在于不同的机器上,有的存在于客户机本机,有的使用.Net Remoting开发,存在于局域网内,有的使用因特网上的Web Service,有的时候,我们希望相同的业务逻辑能够支持不同的客户端。 在这种情况下,我们需要一个一致的服务访问编程模型,以统合不同的服务访问模式,简化系统的开发和部署。Websharp Service Locator(以下简称WSL)提供了这样一种能力,开发人员只需要定义服务访问接口,就可以使用一致的方式透明的访问这些服务,而不用理会这些服务之间的不同点。框架会自动生成访问远程服务需要的代理。 下面简单介绍一下.Net环境下的两种主要分布式访问技术: 2.Web Service Web Service便是基于网络的、分布式的模块化组件,它执行特定的任务,遵守具体的技术规范,这些规范使得Web Service能与其他兼容的组件进行互操作。它可以使用标准的互联网协议,像超文本传输协议HTTP和XML,将功能体现在互联网和企业内部网上。Web Service平台是一套标准,它定义了应用程序如何在Web上实现互操作性。可以使用任何语言,在任何平台上写Web Service。 Web Service平台需要一套协议来实现分布式应用程序的创建。任何平台都有它的数据表示方法和类型系统。要实现互操作性,Web Service平台必须提供一套标准的类型系统,用于沟通不同平台、编程语言和组件模型中的不同类型系统。目前这些协议有: 1.XML和XSD 可扩展的标记语言XML是Web Service平台中表示数据的基本格式。除了易于建立和易于分析外,XML主要的优点在于它既与平台无关,又与厂商无关。XML是由万维网协会(W3C)创建,W3C制定的XML SchemaXSD定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。 Web Service平台是用XSD来作为数据类型系统的。当你用某种语言如https://www.doczj.com/doc/147570850.html,或C#来构造一个Web Service时,为了符合Web Service标准,所有你使用的数据类型都必须被转换为XSD类型。如想让它使用在不同平台和不同软件的不同组织间传递,还需要用某种东西将它包装起来。这种东西就是一种协

远程调用的几种方式

远程调用的几种方式 在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB 和JMS 等,这些名词之间到底是些什么关系呢,它们背后到底是基于什么原理实现的呢,了解这些是实现分布式服务框架的基础知识,而如果在性能上有高的要求的话,那深入了解这些技术背后的机制就是必须的了,在这篇blog中我们将来一探究竟,抛砖引玉,欢迎大家提供更多的实现远程通讯的技术和原理的介绍。 基本原理 要实现网络机器间的通讯,首先得来看看计算机系统网络通信的基本原理,在底层层面去看,网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络IO 来实现,其中传输协议有tcp、udp等等,tcp、udp都是在基于Socket概念上为某类应用场景而扩展出的传输协议,网络IO,主要有bio、nio、aio三种方式,所有的分布式应用通讯都基于这个原理而实现,只是为了应用的易用,各种语言通常都会提供一些更为贴近应用易用的应用层协议。 应用级协议 远程服务通讯,需要达到的目标是在一台计算机发起请求,另外一台机器在接收到请求后进行相应的处理并将结果返回给请求端,这其中又会有诸如one way request、同步请求、异步请求等等请求方式,按照网络通信原理,需要实现这个需要做的就是将请求转换成流,通过传输协议传输至远端,远端计算机在接收到请求的流后进行处理,处理完毕后将结果转化为流,并通过传输协议返回给调用端。 原理是这样的,但为了应用的方便,业界推出了很多基于此原理之上的应用级的协议,使得大家可以不用去直接操作这么底层的东西,通常应用级的远程通信协议会提供: 1. 为了避免直接做流操作这么麻烦,提供一种更加易用或贴合语言的标准传输格式; 2. 网络通信机制的实现,就是替你完成了将传输格式转化为流,通过某种传输协议传输至远端计算机,远端计算机在接收到流后转化为传输格式,并进行存储或以某种方式通知远端计算机。 所以在学习应用级的远程通信协议时,我们可以带着这几个问题进行学习: 1. 传输的标准格式是什么? 2. 怎么样将请求转化为传输的流? 3. 怎么接收和处理流? 4. 传输协议是? 不过应用级的远程通信协议并不会在传输协议上做什么多大的改进,主要是在流操作方面,让应用层生成流和处理流的这个过程更加的贴合所使用的语言或标准,至于传输协议则通常都是可选的,在java领域中知名的有:RMI、XML-RPC、Binary-RPC、SOAP、CORBA、JMS,来具体的看看这些远程通信的应用级协议:

SQL Server服务远程过程调用失败解决

Sql Server服务远程过程调用失败解决 Sql Server服务远程过程调用失败解决 问题: 今天SQL数据库登录不上,提示以下错误: 启动SQL Server配置管理器,发现如下问题(配置环境:win7旗舰版x64,SqlServer2008R2,同时安装VS2012):

以前出现过这个问题,那时候是因为把实例安装在了D盘,后来D盘被格式化了。然后,这些就没了。今天早上打开电脑,竟然又出现这个问题,可是Server2008R2全部装在C盘了呢。 解决方法: 最后查找解决方法,发现故障原因为:安装Visual Studio 2012的时候,自动安装“Microsoft SQL Server 2012 Express LocalDB”服务,导致原本的SQL2008无法正常工作。那么解决方法如下: ①方法一: 打开控制面板,找到程序->卸载程序,把”Microsoft SQL Server 2012 Express LocalDB”卸载掉,然后打开SQL Server 配置管理器,显示一切正常就OK了。 但我的VS2012已经安装半个多月了,怎么今天才出现这个问题? ②方法二: 升级SqlServer2008R2为SP1或者SP2。 但是现在急用,我的实例还在,只是没有启动而已,就尝试如下方法: 右击“计算机”→“管理”→“服务”,找到SQL Server(MSSQLSERVER),右击,选择“启动”。 再登录数据库,没有问题了。但是重新启动系统后,问题会依旧的。 总结:

想要永久解决该问题还得用上面的方法。为防万一,最好进去把自己的数据库备份出来,或者创建一个系统还原点,然后再去尝试。总的来说,上面的两种方法原因都是因为微软的兼容性问题,或者卸载新的回去旧版本,或者升级成为新版本。所以,本人已经通过第二种方法,完美实现正常。

Java远程方法调用

font size="3">概述 Java Remote Method Invocation ( RMI -- Java远程方法调用)允许您使用Java编写分布式对象。本文将介绍RMI的优点以及如何将其连接到现有的和原有的系统中,以及与用Java 编写的组件的连接。 RMI为采用Java对象的分布式计算提供了简单而直接的途径。这些对象可以是新的Java对象,也可以是围绕现有API的简单的Java 包装程序。Java体现了“编写一次就能在任何地方运行的模式。而RMI 可将Java模式进行扩展,使之可在任何地方运行”。 因为RMI是以Java为核心的,所以,它将Java的安全性和可移植性等强大功能带给了分布式计算。您可将代理和梢?务逻辑等属性移动到网络中最合适的地方。如果您要扩展Java在系统中的使用,RMI将使您充分利用其强大功能。 RMI可利用标准Java本机方法接口JNI与现有的和原有的系统相连接。RMI还可利用标准JDBC包与现有的关系数据库连接。RMI/JNI 和RMI/JDBC相结合,可帮助您利用RMI与目前使用非Java语言的现有服务器进行通信,而且在您需要时可扩展Java在这些服务器上的使用。RMI可帮助您在扩展使用时充分利用Java的强大功能。

优点 从最基本的角度看,RMI是Java的远程过程调用(RPC)机制。与传统的RPC系统相比,RMI具有若干优点,因为它是Java面向对象方法的一部分。传统的RPC系统采用中性语言,所以是最普通的系统--它们不能提供所有可能的目标平台所具有的功能。 RMI以Java为核心,可与采用本机方法与现有系统相连接。这就是说,RMI可采用自然、直接和功能全面的方式为您提供分布式计算技术,而这种技术可帮助您以不断递增和无缝的方式为整个系统添加Java功能。 RMI的主要优点如下: 面向对象:RMI可将完整的对象作为参数和返回值进行传递,而不仅仅是预定义的数据类型。也就是说,您可以将类似Java哈希表这样的复杂类型作为一个参数进行传递。而在目前的RPC系统中,您只能依靠客户机将此类对象分解成基本数据类型,然后传递这些数据类型,最后在服务器端重新创建哈希表。RMI则不需额外的客户程序代码(将对象分解成基本数据类型),直接跨网传递对象。 可移动属性:RMI可将属性(类实现程序)从客户机移动到服务器,或者从服务器移到客户机。例如,您可以定义一个检查雇员开支报告

远程调用技术代码追踪之(RemObjects)

远程调用技术代码追踪之(RemObjects) 最近阅读了SocketConn的源码和WebService 的源码,把追踪的过程写了下来,方便大家学习。毕竟这需要精力,时间和毅力。感谢煮茶待英雄博志区和三层数据库讨论区兄弟们的支持,特别是julian兄弟,不是他,我可能没耐心继续下去。如果有时间,大家可以继续完善。从socket和Websevice的底层实现细节,我们发现BORLAND的工程师们的构思和实现的过程。我觉得这对我们的学习应该是非常重要的。学会思考。学会读源码,学会分析。 希望和我交往的朋友可通过QQ或Email联系我。Wu_yanan2003@https://www.doczj.com/doc/147570850.html, 另见:《远程调用技术代码追踪(webservice) 》 《远程调用技术代码追踪(Socket) 》 《远程调用技术代码追踪(ASTA) 》 《远程调用技术代码追踪(RemObjects) 》 远程调用技术内幕 在前面我已经分析了socket和webservice的代码追踪。现在总结一下:三层架构的运作模型:1. BizSnap与.NET Remoting 的Server端运作模式 当Client 将Request 送达Server端后,会经过一个Message Dispatcher机制,这个机制大多是几个重要的组件合作完成,主要在于解出Request中对于所要求对象的描述,以及欲呼叫的方法等信息,有了这些信息后Dispatcher就可以找到对应的对象与方法,接着就开始了呼叫动作,由于Request 是SOAP讯息格式,并不能直接用来呼叫对象的方法,因此得先将SOAP讯息转化为Stack(堆栈),完成这个转换动作后就到了这种处理模式中的核心概念了,也就是建立起目的对象并呼叫对应的方法,这个动作非常依赖前面的Message To Stack程序,因为这个程序会将SOAP讯息转化为Stack,有了Stack之后Push Stack and Call Method 动作才能正确的执行,那么如何呼叫目的方法呢?很简单,只要利用该语言所提供的RTTI信息(.NET 中则是MetaData),就可取得该方法的内存地址,接着只须以低阶的ASM 或IL 所提供的CALL 指令即可呼叫该方法,由于已将SOAP讯息转为Stack,因此传入参数就不是问题了。在呼叫结束后,Stack 中已经有了传回的参数,接着只须将Stack转回SOAP 讯息传回给Client端就可以了。 BizSnap、.NET Remoting 的Client端运作模式 不管是BizSnap或是.NET Remoting,当Client端欲呼叫Web Services时都会经过一个Proxy Object,于BizSnap中这个对象就是THTTPRIO,.NET Remoting中这个对象就是RealProxy,由于这个对象属于静态的,因此在使用之前必需将其转型回目的对象的型别,当Client端下达转型动作后整个魔法就开始运行了,首先Proxy Object会利用RTTI或是MetaData信息取得欲转型的类别信息,并依照这些信息建立起一个兼容于该类别的对象(Transparent Proxy Object),接着将这个对象中的所有方法地址替换为Stub Method,Stub Method 做的事情很单纯,只是将Stack转为SOAP Message后送出,当Server端响应后再将SOAP Message转换为Stack 后返回,这样整个Client端呼叫动作就完成了,下次再呼叫时只需由Cache中取出这个已建立好的Transparent Proxy Object,就可以直接进行呼叫,这可以避免因反复以RTTI或是MetaData建立Transparent Proxy Object而失去效率。 BizSnap、.NET Remoting 的处理模式属于较低阶的方法,这种方法的坏处大于好处,

实习一远程过程调用中间件及数据访问中间件

实验一远程过程调用中间件及数据访问中间件 一、实习目的 通过实例掌握RMI,RPC,JDBC等中间件的使用。 二、实习要求 1)RPC实现远程计算服务。服务器端提供计算服务;客户端调用计算服务。 2)RMI+JDBC远端数据库的访问。实现简单的成绩查询系统(创建表,录入成绩,查询成绩等)。在服务器端,通过JDBC访问数据库。客户端调用服务端提供的各种数据库操作。 3)服务器和客户端不在同的机器上进行测试。 4)打包成易于执行的文件,如exe, bat文件。 三、实习过程 1 利用RPC实现远程计算服务。 (1)使用IDL定义服务接口mathservice.idl, 定义计算服务操作,方法如下: 加:void Cal_Add([in] double a, [in] double b, [out] double * result); 减:void Cal_Sub([in] double a, [in] double b, [out] double * result); 乘:void Cal_Mul([in] double a, [in] double b, [out] double * result); 除:void Cal_Div([in] double a, [in] double b, [out] double * result); (2)编写配置文件mathservice.acf, 定义绑定句柄 (3) 编译mathservice.idl文件,产生文件mathservice.h, mathservice_s.c, mathservice_c.c (4) 编写服务端程序, 编译连接工程,生成mathservice.exe (5) 编写客户端程序 (6) 测试: 测试结果截图如下: 加法运算:

用Java实现SOAP的XML文档网络传输及远程过程调用RPC

用Java实现基于SOAP的XML文档网络传输及远程过程调用(RPC) SOAP(Simple Object Access Protocol,简单对象访问协议) 是一种基于XML的,用于计算机之间交换信息的协议。SOAP能应用于各种消息接发系统,并能通过各种传输协议进行消息传递,但最初的侧重点是通过HTTP传输的远程过程调用。SOAP是Web service的一个重要组成部份,如果把Web service比喻成Internet,那么SOAP就可以比喻成TCP/IP。SOAP是一种协议而非具体产品,微软也有自己的SOAP实现产品,而Java下比较流行的SOAP实现产品就是Apache SOAP,不过它的下一个版本已经改名成AXIS了。 SOAP是用XML文件来做为数据转输的载体的,走HTTP的线路。一般企业的防火墙都开放HTTP的80端口,所以SOAP不会被防火墙阻断,这算是SOAP的一个优点。信息转输的双方都要求支持SOAP服务,因为XML文件发过去,则对方需要有SOAP服务来接收,然后对方会有反馈也是XML文件,这时你也需要安装SOAP服务来接收。 1. 环境配置 为了运行程序,我们首先必须配置好环境: 共要下载四个软件包,它们都是开源免费的。其中,前两个是Apache的,后两个是SUN 网站的,如下所示: ?SOAP:2.3.1/ ?Xerces: ?JavaMail: ?JAF: 下载后将它们分别解压缩。分别在这四个包的解压目录中找到:xerces.jar、soap.jar、mail.jar、activation.jar(JAF的),则是四个jar文件是我们所需要的。 本机安装环境:WindowsXP(SP2) + JDK1.4.2_06 + Tomcat5.0.28 + SOAP2.3.1 配置步骤: 1、安装JDK和Tomcat。过程比较简单,这里不再详述。 2、将刚才所找到的四个jar文件复制到Tomcat的“Tomcat 5.0\common\lib”目录下, 这个目录是Tomcat的默认包目录,在这个目录中的所有包在Tomcat启动时都会 被自动加载。 3、将\ JDK1.4.2\lib\路径下的tools.jar也复制到Tomcat的“Tomcat 5.0\common\lib”目录下。

RMI远程方法调用

Java RMI 技术原理(远程方法调用)Java RMI指的是远程方法调用。它是一种机制,能够让在某个Java虚拟机上的对象调用另一个Java虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。 Java RMI不是什么新技术(JDK1.1就有了),但却是是非常重要的底层技术。大名鼎鼎的EJB都是建立在RMI基础之上的,现在还有一些开源的远程调用组件,其底层技术也是RMI。 在这个大力吹捧Web Service、SOA的年代,不是每个应用都应该选用笨拙的Web Service组件来实现,有人通过对比测试后,认为RMI是最简单的,在一些小的应用中是最合适的。在Java中,只要一个类extends了 java.rmi.Remote接口,即可成为存在于服务器端的远程对象,供客户端访问并提供一定的服务。 注意:extends了Remote接口的类或者其他接口中的方法若是声明抛出了RemoteException异常,则表明该方法可被客户端远程访问调用。 同时,远程对象必须实现java.rmi.server.UniCastRemoteObject类,这样才能保证客户端访问获得远程对象时,该远程对象将会把自身的一个拷贝以Socket的形式传输给客户端,此时客户端所获得的这个拷贝称为“存根stub”,而服务器端本身已存在的远程对象则称之为“骨架skeleton”。其实此时的Stub 是客户端的一个代理,用于与服务器端的通信,而Skeleton也可认为是服务器端的一个代理,用于接收客户端的请求之后调用远程方法来响应客户端的请求。 从客户对象经存根(Stub)、远程引用层(Remote Reference Layer)和传输层(Transport Layer)向下,传递给主机,然后再次经传输层,向上穿过远程

Android远程Service调用(RPC)实现步骤详解

开始介绍之前,先看一下本例的界面:

Android远程Service调用 简介: 远程Service调用,是Android系统为了提供进程间通信而提供的轻量级实现方式,这种方式采用一种称为远程进程调用技术来实现,英文名全称是Remote Procedure Call,即RPC。

RPC简介:远程进程调用是指在一个进程里,调用另外一个进程里的服务。Android通过接口定义语言来生成两个进程间的访问代码。接口定义语言(Android Interface Definition Language,即AIDL)是Android系统的一种接口描述语言,Android编译器可以将AIDL文件编译成一段JA V A代码,生成相对的接口。 下面来详细介绍下如何通过RPC机制来达到远程进程调用的目的和步骤。 第一,我们要先弄清楚这是怎么样的一个流程。用通俗点语言来说,打个例子:比如公司A提供A服务,并且这种服务是对外开放的,也就是其他公司或者个人都可以通过某种方式来使用这种服务,公司B想要使用A公司的A服务,就以通过公司A编制的一种形式来使用它。用图来表示就是: 公司B通过公司A的某种形式来使用公司A提供的服务A 现在,我们可以说,进程B可以通过进程A提供的某种形式来使用进程A的服务A。这个过程就是RPC。 了解基本概念之后,我们可以开始进行RPC的实现步骤。下面我们分点来说明实现RPC 的步骤。 第一、创建AIDL文件。这个文件和普通的JA V A文件差不多,只不过后缀名是.aidl。 这个文件相当于一个接口,里面要声明一些你想对外提供服务的方法,也就是 你要对外暴露的方法。注意,这个文件里,除了JA V A基本类型和String,List,Map 和Charquene类型不需要引入相应的包外,其他的都要引入包。例如我们创建 一个IPerson.aidl文件,里面只声明了一个方法display(): package com.test.service; interface IPersonaidl { String display();//该接口里面所有的方法都应该是你想对外暴露的} 第二、创建完AIDL文件后,刷新项目,会发现在gen目录对应的目录下会生成一个IPerson.java接口文件,打开该文件,会发现你在aidl文件里面定义的 display()方法,不过没有实现。 第三、实现系统生动生成的IPerson接口。注意,这里创建的类不能写实现系统生成的IPerson接口,而是继承该接口里面的Stub类。 package com.test.service; import android.os.RemoteException;

远程过程调用失败

服务器:Windows Server2003 sp2服务器 客户端:XP SP3 内容:C#Winform客户端调用服务器的Excel模板生成报表的时候,生成失败,抛出的异常如下: TargetInvocationException{ Source : mscorlib Message : Exception has been thrown by the target of an invocation. Data : ListDictionaryInternal{} HelpLink : null TargetSite: InvokeDispMethod at System.RuntimeType.InvokeDispMethod(String name, BindingFlagsinvokeAttr, Object target, Object[] args, Boolean[] byrefModifiers, Int32 culture, String[] namedParameters) at System.RuntimeType.InvokeMember(String name, BindingFlagsbindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams) at System.Type.InvokeMember(String name, BindingFlagsinvokeAttr, Binder binder, Object target, Object[] args, CultureInfo culture) at https://www.doczj.com/doc/147570850.html,Base.InvokeMethod(String method, Object[] args) at CIS.Interop.Microsoft.Excel.ExcelApplication.Run(String macroName, Object[] args) at CIS.IS.Data.Manager.ExcelReportMaker.DoWork() ************************ COMException{ Message :远程方法调用失败(Exception from HRESULT: 0x800706BE) Data : ListDictionaryInternal{} ErrorCode : -2147023170 HelpLink : null } }

怎样远程连接别人电脑

最佳答案 只要安装了Remotely Anywhere,在任何可以上网的设备上,只要有一个支持Java的浏览器(Internet Explorer、Netscape Navigator等目前常用的都符合要求),你就可以轻松控制远端服务器或者电脑了。 一、安装程序 安装过程中如果使用“典型安装”(Typical),就会使用默认的2000端口。当然,你也可以选择“自定义安装”(Custom),在安装时指定你想要使用的端口。 安装完成后可以看到提示窗口中出现的软件使用方法。如果是本机操作,那么直接在浏览器地址栏中输入http://127.0.0.1:2000就会出现登录页面。如果想从其他电脑上访问,则需要把“127.0.0.1”这个IP地址改成外部可以访问的公网地址。如果你够细心,会发现安装完成之后在系统托盘里会新增三个图标。 二、安装许可证 程序安装完成之后,使用之前还必须安装许可证。根据不同版本对应不同的许可证,可以在Remotely Anywhere的网站上面申请免费的30天试用许可证,在上面的登录页面中用该电脑的可登录账号进入,然后输入收到的许可证代码即可。 三、安装数字证书 要保证远程使用的安全,首先就要配置“数字证书”(SSL)。经过配置之后的数据传输经过加密处理,可以保证信息的安全。在页面上点击“Security→SSL Setup”,输入国家(Country)、单位(Organization)、个人名称(Your Name)之后,点击“Create SC”在服务器端生成数字签名。 这是在服务器端生成数字证书,要保证数据传输安全,还要在浏览电脑上面安装该证书。点击下面的“Install The CA Certificate In Your Browser”,按照提示安装即可。安装和使用数字证书是为了保证数据传输的绝对安全和不被他人窃取信息,其实一般说来,即使不使用数字证书加密传输信息,通常情况下也不会有什么问题。 四、配置 Remotely Anywhere的服务器端在安装好之后,几乎不用任何配置即可使用。不过如果服务器或者被控电脑装有_blank">防火墙,需要把TCP/IP的2000端口打开(2000是Remotely Anywhere默认的使用端口,你也可以自己指定一个端口给它使用)。其他需要设置的内容也是非常简单直观的,详细设置将在下面的具体应用时一并介绍。 五、登录

远程I O模块使用说明

远程I/O模块使用说明 一.概述 8通道模拟量热电偶信号混合型采集模块,采用最新技术和进口原装芯片.具有精度高,性能稳定,抗干扰强,隔离,高速经济的特点,能在恶劣环境下运行. RS485接口,支持Modbus RTU ,DECON标准协议,停止位和波特率随意设置,是PLC控制系统扩展热电偶采集的最佳选择.可以直接连接PLC、DCS 以及国内外各种组态软件(亚控组态力控组态MCGS等等)。 二.技术指标 型号:TDAM7018 通道数: 8通道 信号类型:K,J,E,R,S,N,T,B,钨铼(2000多度)等型热电偶,通过软件设置各通讯输入类型 电流采集范围:±20mA, 0-20 mA, 4-20Ma 电压采集范围:±1000mV或±10V ±5V,±100mV,±500mV, ±1V 精度:0.1级 分辩率: 24位 扫描周期:100ms 采样频率:AD采样频率每通道1000次/秒,数据刷新3次/秒 通讯接口:RS485接口.光电隔离,ESD保护. 标准协议:MODBUS-RTU DECON协议 工作电源:9-36VDC 功耗: 1.0W 冷端补偿误差: <±1℃. 环境温度:温度-20~70℃ 相对湿度:≤85% RH 无凝结 通讯距离:1200米,可加中继延长 安装方式:DIN35mm标准导轨卡装或螺钉固定. 产品外观尺寸:100*70*26MM 含端子尺寸:120*70*26MM 三.功能和特点 z8路差分输入:提供高过压保护和传感器断线检测功能;抗干扰强隔离,高速经济,使用范围广. z采样频率: AD采样频率每通道1000次/秒,数据刷新3次/秒 z通讯接口: RS485接口. 隔离电压: 3000 VDC. z RS485通信: 光电隔离,ESD保护.通信部分电源隔离,信号采用高速光耦光电隔离,使通信更稳定可过压过流保护,TVS管保护,全方位保护通信芯片! z标准协议: 支持DCON和Modbus RTU协议,停止位和波特率随意设置,是PLC控制系统扩展模拟量或热电偶采集的最佳选择. z业界独创1: 采用PT1000作为冷端补偿,冷端补偿温度精度更高,性能更稳定,模块内置测温元件,自动完成热电偶冷端温度补偿; z业界独创2: 唯一能采2000多度的钨铼型热电偶 z热电偶输入过压保护:±220V. 输入阻抗: 20兆欧姆. z电源输入端: 具有直流滤波器功能,抗干扰能力强,适用于恶劣环境下运行.

RPC远程过程调用

南华大学 计算机科学与技术学院 实验报告 (2010~2011学年度第2学期) 课程名称分布式系统 题目RPC远程过程调用 一、实验目的 通过远程过程调用(RPC)的OSF以及如何使用它们来开发应用程序,了解RPC的基本原理,并认识如何开发使用RPC进行异种机网络分布式处理的客户机应用程序和服务器应用程序。实现一个简单的rpc远程过程调用程序,学会一些基本的rpc函数的使用方法 二、实验环境

操作系统:Windows 7 开发环境: Microsoft Visual C++ 三、实验步骤 1. 定义接口:创建一个.idl文件, 为应用程序的远地函数定义一个接口.// File: RpcFact.idl // interface header uuid (C16F6562-520D-11D0-B338-444553540000), // universally unique identifier,唯一识别这个接口, 它可以被服务器用来注册接口, 以使客户机可以定位这个特殊接口. uuid由5位数字组成,你可以用Microsoft的uuidgen.exe来得到它. version (1.0), // 指定版本号, 那么在同一个网络上就可以同时拥有一个R PC接口的不同版本 endpoint(“ncalrpc: [myFactorial]”) // 接口的端点, 它给出了将会使用的网络协议的类型和用来接收接口的请求的地址和端口, ncalrpc 表示Local pr ocedure call // interface text, 指定了组成这个接口的函数, 函数类型不支持int 和void* interface rpcfactor ial { long RpcFactor ial([in] long nVal); // 出现[ ]的部分表示属性 } // end File RpcFact.idl 2. 应用程序属性配置文件 // RpcFact.acf [ auto_handle // 相关属性] interface rpcfactor ial{ }// end File RpcFact.acf 3. 用MIDL编译器编译RpcFact.idl文件 先将RpcFact.idl插入你的Project中, 在Projects—Settings中选取左边框内的RpcFact.idl文件, 选择右边的Custom Build页面, 位IDL文件指定一个用户定制的编译器. 可以键入如下命令:midl.exe /c_text /ms_text /app_config $ (InputPath) 4. 开发RPC服务器 定义好了一个接口之后, 就需要创建一个响应接口请求的进程, 执行请求的操作并返回所有结果给client. 这些任务就由RPC服务器来完成.

相关主题
文本预览
相关文档 最新文档