Java远程方法调用

合集下载

curl 调用java类方法

curl 调用java类方法

curl 调用java类方法Curl调用Java类方法在现代软件开发中,我们常常需要在不同的编程语言之间进行交互,以实现各种功能需求。

在Java开发中,我们经常使用curl命令行工具来实现与其他系统或服务的通信。

本文将介绍如何使用curl调用Java类方法,实现Java程序与curl的无缝对接,以及一些常见问题和注意事项。

一、Curl简介curl是一个命令行工具,用于发送HTTP请求并获取响应。

它支持多种协议,如HTTP、HTTPS、FTP等,并提供了丰富的选项和功能,使得我们能够以各种方式与网络进行交互。

在Java开发中,我们可以使用curl来模拟各种HTTP请求,与远程服务进行通信。

二、使用curl调用Java类方法在Java中,我们可以通过命令行来执行Java类的方法。

下面是使用curl调用Java类方法的基本步骤:1. 编写Java类:首先,我们需要编写一个包含所需方法的Java类。

可以使用任何Java开发工具,例如Eclipse或IntelliJ IDEA。

2. 将Java类编译为字节码文件:使用javac命令将Java源文件编译为字节码文件。

例如,假设我们的Java类文件名为Hello.java,执行以下命令完成编译:javac Hello.java这将生成一个名为Hello.class的字节码文件。

3. 使用curl执行Java类方法:使用curl命令调用Java类的方法。

语法如下:curl "http://localhost:8080/Hello?method=sayHello&name=John"- "http://localhost:8080/Hello"是Java服务器的URL地址和路径。

- "method=sayHello"是要调用的Java类方法。

- "name=John"是传递给Java类方法的参数。

java中remoteaddress方法

java中remoteaddress方法

java中remoteaddress方法Java中的remoteAddress方法是一个用于获取远程客户端的IP地址的方法。

在网络编程中,了解客户端的IP地址对于进行一些网络限制,安全验证或者日志记录都是非常有用的。

在本文中,我们将逐步解释如何使用Java中的remoteAddress方法来获取远程客户端的IP地址,并探讨一些相关的概念和实践应用。

1.什么是远程地址(remote address)?远程地址是指与我们的应用程序交互的客户端的IP地址。

对于网络上的每个连接,都有一个本地地址和一个远程地址。

本地地址是指我们的应用程序所在的主机(服务器)的IP地址,而远程地址是指与我们的应用程序交互的客户端的IP地址。

远程地址是一个重要的信息,它可以用于识别客户端,做出相应的处理或者记录日志等。

2.如何使用Java的remoteAddress方法?在Java中,可以通过Java提供的Socket类或者HttpServletRequest 类来获取远程地址。

# 2.1 使用Socket类获取远程地址要使用Socket类获取远程地址,我们首先需要创建一个ServerSocket 对象来监听一个端口,并等待客户端连接。

当有客户端请求连接时,我们可以通过调用Socket类的getRemoteSocketAddress()方法来获取客户端的远程地址。

以下是一个示例代码:javaimport java.io.*;import .*;public class Server {public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(1234);System.out.println("Server is listening on port 1234...");Socket socket = server.accept();InetAddress remoteAddress =socket.getRemoteSocketAddress();System.out.println("Client connected from: " + remoteAddress);其他业务处理...socket.close();server.close();}}在上面的示例中,我们监听了端口号为1234的连接,当有客户端连接时,通过调用socket.getRemoteSocketAddress()方法来获取客户端的远程地址,并将其打印出来。

【JavaEE学习80下】【调用WebService服务的四种方式】【WebService。。。

【JavaEE学习80下】【调用WebService服务的四种方式】【WebService。。。

【JavaEE学习80下】【调⽤WebService服务的四种⽅式】【WebService。

不考虑第三⽅框架,如果只使⽤JDK提供的API,那么可以使⽤三种⽅式调⽤WebService服务;另外还可以使⽤Ajax调⽤WebService 服务。

预备⼯作:开启WebService服务,使⽤jdk命令wsimport⽣成调⽤源代码package com.kdyzm.ws;import javax.jws.WebService;import javax.xml.ws.Endpoint;@WebServicepublic class MyWsServer {public String calculate(int input){System.out.println("接收到请求数据:"+input);return input*input+"";}public static void main(String[] args) {Endpoint.publish("http://localhost:9090/ws", new MyWsServer());System.out.println("server ready ......");}} ⽣成源代码命令:wsimport -s . http://localhost:9090/ws?wsdl 可能出现的问题参考: 因为出现了上述问题,所以本次测试环境使⽤jdk 1.7。

⽅法⼀:使⽤最简单、效率最⾼的⽅法调⽤WebService服务 将⽣成的java⽂件包括⽂件夹直接导⼊项⽬,并使⽤其提供的API。

1package com.kdyzm.call.method;23import com.kdyzm.ws.MyWsServer;4import com.kdyzm.ws.MyWsServerService;56/**7 * 第⼀种⽅式就是使⽤wsimport命令获取所有的需要调⽤的代码,并直接使⽤这些代码完成任务8 * @author kdyzm9 *10*/11public class Method1 {12public static void main(String[] args) {13 MyWsServerService myWsServerService=new MyWsServerService();14 MyWsServer myWsServer=myWsServerService.getMyWsServerPort();15 String result=myWsServer.calculate(2);16 System.out.println(result);17 }18 } 客户端控制台打印结果:4 服务端控制台打印结果: 这种⽅式是使⽤最多的⽅式,也是最不容易出错、效率最⾼的⽅式,推荐使⽤这种⽅式。

浅谈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对象,并 远程调用其方法。程序的对象是客户 ,而远程对象是服务器。 远程对象也可以是另一个远程服务对象 的客户 。通过使用持 续性 ( 串行化和解 串行化) ,本地对象和原始类型值可以作为

grpc java例子

grpc java例子

grpc java例子gRPC(gRPC Remote Procedure Call)是一种高性能、开源的远程过程调用(RPC)框架,由Google开发。

它使用HTTP/2 协议进行通信,支持多种编程语言。

本文将介绍如何在Java中使用gRPC,并提供一个简单的例子以帮助初学者了解基本的使用方法。

1. gRPC 简介gRPC 提供了一种轻量、高效、跨语言的RPC 框架。

其特点包括:•IDL(Interface Definition Language):使用Protobuf(Protocol Buffers)定义服务接口,简化了服务定义过程。

•多语言支持:gRPC 支持多种编程语言,包括Java、C++、Python 等。

•HTTP/2 协议:使用HTTP/2 进行通信,提供了更高的性能和效率。

•支持多种调用类型:提供简单RPC、流式RPC 等多种调用方式。

2. gRPC Java 快速开始在Java 中使用gRPC,首先需要定义服务接口,然后生成客户端和服务器端的代码。

以下是一个简单的例子,演示了如何创建一个简单的gRPC 服务。

2.1 定义服务接口使用Protobuf 定义服务接口。

在HelloWorld.proto 文件中定义一个简单的服务:syntax = "proto3";service Greeter {rpc SayHello (HelloRequest) returns (HelloResponse);}message HelloRequest {string name = 1;}message HelloResponse {string message= 1;}2.2 生成代码使用Protocol Buffers 编译器生成Java 代码:protoc -I=src/main/proto --java_out=src/main/java src/main/proto/HelloWorld.pro to2.3 实现服务创建一个实现服务接口的类GreeterImpl.java:import io.grpc.stub.StreamObserver;public class GreeterImpl extends GreeterGrpc.GreeterImplBase{@Overridepublic void sayHello(HelloRequest request,StreamObserver<HelloResponse> responseObserver){String message ="Hello, "+request.getName()+"!";HelloResponse response =HelloResponse.newBuilder().setMessage(mess age).build();responseObserver.onNext(response);responseObserver.onCompleted();}}2.4 启动服务器import io.grpc.Server;import io.grpc.ServerBuilder;public class HelloWorldServer {public static void main(String[]args)throws Exception{Server server =ServerBuilder.forPort(8080).addService(new GreeterImpl()).build();server.start();System.out.println("Server started on port 8080");server.awaitTermination();}}2.5 创建客户端import io.grpc.ManagedChannel;import io.grpc.ManagedChannelBuilder;public class HelloWorldClient {public static void main(String[]args){ManagedChannel channel =ManagedChannelBuilder.forAddress("localho st",8080).usePlaintext().build();GreeterGrpc.GreeterBlockingStub blockingStub =GreeterGrpc.newBlocki ngStub(channel);HelloRequest request =HelloRequest.newBuilder().setName("John").buil d();HelloResponse response =blockingStub.sayHello(request);System.out.println("Response from server: "+response.getMessage());channel.shutdown();}}3. 运行示例1.启动服务器:java HelloWorldServer2.运行客户端:java HelloWorldClient你将会看到客户端输出的消息为"Response from server: Hello, John!",这表示gRPC 服务已经成功运行。

java分布式实现原理

java分布式实现原理

java分布式实现原理Java分布式实现原理分布式系统是指由多台计算机组成的系统,这些计算机通过网络进行通信和协调,共同完成复杂的任务。

Java是一种广泛使用的编程语言,它提供了一些工具和机制来实现分布式系统。

1. 网络通信:Java提供了Socket编程接口,可以通过套接字来在不同计算机之间进行网络通信。

通过建立输入和输出流,可以实现数据的传输和交换。

这样,在分布式系统中的不同计算机之间可以进行消息的发送和接收。

2. 远程方法调用(RPC):Java的RMI(远程方法调用)机制使得在不同计算机之间进行方法的调用变得简单。

通过定义接口和实现类,并通过RMI机制发布和获取远程对象,可以方便地在分布式系统中进行方法调用。

3. 分布式数据存储:Java提供了多种机制来进行分布式数据存储。

例如,Java的数据库连接池可以使用多个数据库连接,以实现对大型数据库的分布式访问。

此外,Java还提供了分布式缓存系统,如Redis和Memcached,用于在分布式系统中高效地存储和获取数据。

4. 分布式任务调度:Java的定时任务调度框架,如Quartz和Spring Scheduler,可以帮助实现分布式系统中的任务调度。

这些框架可以根据预定的时间表和条件触发任务的执行,从而实现任务的分布式调度和执行。

5. 分布式事务处理:Java的分布式事务处理框架,如Java Transaction API(JTA)和Java Transaction Service(JTS),可以帮助实现多个系统之间的事务管理。

这些框架提供了事务的协调和控制机制,确保分布式系统中的事务得以正确执行和提交。

总之,Java提供了许多工具和机制来实现分布式系统。

通过网络通信、远程方法调用、分布式数据存储、分布式任务调度和分布式事务处理等功能,可以将多个计算机连接成一个整体,协同工作,实现复杂任务的完成。

javahttpUrlConnection调用远程接口报400

javahttpUrlConnection调⽤远程接⼝报400java httpUrlConnection 调⽤远程接⼝报4001.问题的出现:线下开发时候使⽤httpUrlConnction测试调⽤远程接⼝⼀点问题都没有,但是打包后放到线上去后出现400的错误同样的参数在线下可以调试,放在线上就不⾏了。

分析⼀般报400说明接⼝接收到了错误的参数,由于是远程调⽤别⼈的服务器接⼝看不到那边的⽇志,我们这边只有⼀个400 ,信息提⽰说对⾯json解析错误。

那么我们同样的参数为什么放在线上就会出问题,原因可能是我们的服务器的环境或者编码不对。

解决的办法修改参数的编码,但是不管对json字符串怎么编码,都不管⽤,最后发现要再读⼊流的时候对参数进⾏编码才可以,编码的地⽅不对代码⽰例/*** 调⽤远程接⼝* @param url 接⼝的url路径* @param pamare List的json数组* @return*/public static String sendPost(String url, String pamare) {PrintWriter out = null;BufferedReader in = null;String result = "";try {// 打开和URL之间的连接HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();// 设置通⽤的请求属性conn.setRequestMethod("POST");conn.setConnectTimeout(4 * 1000);conn.setRequestProperty("Content-Type", "application/json;charset=UTF-8");// 发送POST请求必须设置如下两⾏conn.setDoOutput(true);conn.setDoInput(true);// 获取URLConnection对象对应的输出流out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "utf-8"));out.println(pamare);// flush输出流的缓冲out.flush();InputStream is = null;if (conn.getResponseCode() >= 400) {is = conn.getErrorStream();} else {is = conn.getInputStream();}// 定义BufferedReader输⼊流来读取URL的响应in = new BufferedReader(new InputStreamReader(is,"utf-8"));String line;while ((line = in.readLine()) != null) {result += line;}} catch (Exception e) {System.out.println("发送 POST 请求出现异常!" + e);e.printStackTrace();}//使⽤finally块来关闭输出流、输⼊流finally {try {if (out != null) {out.close();}if (in != null) {in.close();}} catch (IOException ex) {ex.printStackTrace();}}return result;}。

php调用java方法 -回复

php调用java方法-回复如何使用PHP调用Java方法在开发过程中,我们经常会遇到需要在PHP代码中调用Java方法的情况。

这种情况下,我们可以通过使用PHP的Java Bridge来实现。

PHP的Java Bridge是一个开源的项目,它通过为Java类和方法提供了一个远程调用接口,使得PHP可以直接调用Java方法。

下面,我将一步一步地介绍如何使用PHP调用Java方法。

步骤一:安装和配置PHP的Java Bridge首先,我们需要安装PHP的Java Bridge。

你可以在PHP官方网站上找到PHP的Java Bridge扩展。

下载并安装这个扩展。

安装完成后,我们需要在php.ini文件中启用PHP的Java Bridge扩展。

找到php.ini文件,并在文件中添加以下行:[Java Bridge]extension=php_java.dll保存并关闭文件之后,重启Web服务器使修改生效。

步骤二:启动Java Bridge服务器接下来,我们需要启动Java Bridge服务器。

打开命令行窗口,进入PHP 的Java Bridge目录,运行以下命令:java -jar JavaBridge.jar SERVLET:8080这条命令会启动一个Java Bridge服务器,监听8080端口。

步骤三:创建Java类和方法在PHP中调用Java方法之前,我们需要编写一个Java类和方法。

假设我们要调用的Java方法是一个简单的计算器方法,可以接收两个整数参数并返回它们的和。

创建一个名为Calculator的Java类,并在其中添加一个名为add的方法。

代码如下:javapublic class Calculator {public static int add(int a, int b) {return a + b;}}编译并将这个Java类打包成一个jar文件。

步骤四:在PHP中调用Java方法现在我们可以在PHP中调用Java方法了。

java中webapi调用方式

在Java中,Web API调用是一项非常常见的任务。

Web API是一种由HTTP 协议提供服务的接口,它允许不同的应用程序之间进行通信。

在本文中,我将以从简到繁、由浅入深的方式来探讨Java中WebAPI调用的方式,并共享我对这个主题的个人观点和理解。

1. URLConnection类我们可以使用Java内置的URLConnection类来进行简单的Web API 调用。

这个类提供了一种简单而基本的方式来打开一个到指定URL资源的通信信息,并可以读取和写入该资源。

它适用于简单的GET和POST请求,但在处理复杂的响应和错误处理方面就显得力不从心了。

2. Apache HttpClientApache HttpClient是一个强大的Java HTTP客户端库,它为开发人员提供了更丰富的功能和更灵活的方式来进行Web API调用。

相比于URLConnection类,HttpClient具有更强大的功能,例如支持HTTPS、重定向、HTTP代理等。

它还提供了更友好的API,使得我们可以更轻松地处理响应和错误。

3. Spring RestTemplate作为Spring框架的一部分,RestTemplate是一种简化了的HTTP客户端工具,它提供了一种更优雅的方式来进行Web API调用。

通过RestTemplate,我们可以很容易地实现GET、POST、PUT、DELETE 等HTTP方法的调用,并且可以方便地处理响应和错误。

4. Reactive WebClient随着Spring 5引入了响应式编程范式,Reactive WebClient成为了一种新的选择。

它使用了Reactor库,提供了一种基于响应式流的方式来进行Web API调用。

这种方式在处理大量并发请求时具有很大的优势,并且可以方便地进行响应式编程。

总结回顾:在本文中,我从URLConnection类开始介绍了Java中Web API调用的方式,然后逐步深入介绍了Apache HttpClient、Spring RestTemplate和Reactive WebClient。

用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:/ws/soap/version-2.3.1/⏹Xerces:/dist/xerces-j/⏹JavaMail:/products/javamail/downloads/index.html⏹JAF:/products/javabeans/glasgow/jaf.html下载后将它们分别解压缩。

分别在这四个包的解压目录中找到: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。

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

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可将属性(类实现程序)从客户机移动到服务器,或者从服务器移到客户机。

例如,您可以定义一个检查雇员开支报告的接口,以便察看雇员是袷亓斯 灸壳笆敌械恼 摺T诳 Пǜ娲唇ê螅 突Щ 突岽臃 衿鞫嘶竦檬迪指媒涌诘亩韵蟆H绻 叻⑸ 浠 衿鞫司突峥 挤祷厥褂昧诵抡 叩母媒涌诘牧硪桓鍪迪殖绦颉D 槐卦谟没 低成习沧叭魏涡碌娜砑 湍茉诳突Ф思觳橄拗铺跫�--从而向用户提供烁?快的反馈,并降低服务器的工作量。

这样就能具备最大的灵活性,因为政策改变时只需要您编写一个新的Java类,并将其在服务器主机上安装一次即可。

设计方式:对象传递功能使您可以在分布式计算中充分利用面向对象技术的强大功能,如二层和三层结构系统。

如果您能够传递属性,那么您就可以在您的解决方案中使用面向对象的设计方式。

所有面向对象的设计方式无不依靠不同的属性来发挥功能,如果不能传递完整的对象--包括实现和类型--就会失去设计方式上所提供的优点。

安全:RMI使用Java内置的安全机制保证下载执行程序时用户系统的安全。

RMI使用专门为保护系统免遭恶意小应用程序侵害而设计的安全管理程序,可保护您的系统和网络免遭潜在的恶意下载程序的破坏。

在情况严重时,服务器可拒绝下载任何执行程序。

便于编写和使用:RMI使得Java远程服务程序和访问这些服务程序的Java客户程序的编写工作变得轻松、简单。

远程接口实际上就是Java 接口。

服务程序大约用三行指令宣布本身是服务程序,其它方面则与任何其它Java对象类似。

这种简单方法便于快速编写完整的分布式对象系统的服务程序,并快速地制做软件的原型和早期版本,以便于进行测试和评估。

因为RMI程序编写简单,所以维护也简单。

可连接现有/原有的系统:RMI可通过Java的本机方法接口JNI与现有系统进行进行交互。

利用RMI和JNI,您就能用Java语言编写客户端程序,还能使用现有的服务器端程序。

在使用RMI/JNI与现有服务器连接时,您可以有选择地用Java重新编写服务程序的任何部分,并使新的程序充分发挥Java的功能。

类似地,RMI可利用JDBC、在不修改使用数据库的现有非Java源代码的前提下与现有关系数据库进行交互。

编写一次,到处运行:RMI是Java“编写一次,到处运行”方法的一部分。

任何基于RMI的系统均可100%地移植到任何Java虚拟机上,RMI/JDBC系统也不例外。

如果使用RMI/JNI与现有系统进行交互工作,则采用JNI编写的代码可与任何Java虚拟机进行编译、运行。

分布式垃圾收集:RMI采用其分布式垃圾收集功能收集不再被网络中任何客户程序所引用的远程服务对象。

与Java 虚拟机内部的垃圾收集类似,分布式垃圾收集功能允许用户根据自己的需要定义服务器对象,并且明确这些对象在不再被客户机引用时会被删除。

并行计算:RMI采用多线程处理方法,可使您的服务器利用这些Java 线程更好地并行处理客户端的请求。

Java分布式计算解决方案:RMI 从JDK 1.1开始就是Java平台的核心部分,因此,它存在于任何一台1.1 Java虚拟机中。

所有RMI系统均采用相同的公开协议,所以,所有Java 系统均可直接相互对话,而不必事先对协议进行转换。

传递属性前面我们讲到,RMI可以传递属性,并简单介绍了一下一个有关开支报告程序的情况。

下面我们将深入讨论如何设计这样的系统。

这样介绍的目的是使您能够利用RMI的功能将属性从一个系统传递到另一个系统,并随心所欲地安排当前的计算地点,并便于将来的改变。

下面的例子并未涉及真实世界可能发生的所有问题,但可帮助读者了解处理问题的方法。

服务器定义的策略图1是可进行动态配置的开支报告系统的示意图。

客户机向用户显示图形用户界面(GUI),用户填写开支报告。

客户机程序使用RMI 与服务器进行通信。

服务器使用JDBC( Java关系数据库连接包)将开支报告存储在数据库中。

至此,这看起来与其它多层次系统大同小异,但有一个重大区别-- RMI能下载属性。

假定公司关于开支报告的政策发生改变。

例如,目前公司只要求对超过20美元的开支需开具发票。

但到明天,公司认为这太宽松了,便决定除不超过20美元的餐费以外,任何开支均需开具发票。

如果不能下载属性的话,那么在设计便于修改的系统时您可选择下列方法之一:用客户端安装与政策有关的程序。

政策改变时,必须更新包含此政策的所有客户端程序。

您可在若干服务器上安装客户程序,并要求所有用户从这些服务器之一运行客户程序,从而减少问题。

但这仍不能彻底解决问题-- 那些让程序运行好几天的用户就无法使程序更新,而总是会有一些用户为了方便而把软件复制到本地磁盘上。

您可要求服务器在每次向开支报告添加项目时检查政策。

但这样就会在客户机和服务器之间产生大量数据流,并增加服务器的工作量。

这还会使系统变得更加脆弱--网络故障会立即妨碍用户,而不仅仅是只在其呈交开支报告或启动新的报告时对其产生影响。

同时,添加项目的速度也会变慢,因为这需要穿越整个网络往返一圈才能到达(不堪重负的)服务器。

您可在呈交报告时要求服务器对政策进行检查。

这样就会使用户创建很多必须待批报告的错误项目,而不是立刻捕捉到第一个错误,从而使用户有机会停止制造错误。

为避免浪费时间,用户需要立刻得到有关错误的反馈。

有了RMI,您就能以简单的方法调用程序从服务器得到属性,从而提供了一种灵活的方式,将计算任务从服务器卸载到客户机上,同时为用户提供速度更快的反馈。

当用户准备编写一份新的开支报告时,客户机就会向服务器要求一个对象,该对象嵌入了适用于该开支报告的当前政策,就如同通过用Java编写的政策接口所表示的那样。

该对象可以以任何方式实现当前政策。

如果这是客户机RMI首次看到这种专门执行的政策,就会要求服务器提供一份执行过程的副本。

如果执行过程将来发生变化,则一种新的政策对象将被返回给客户机,而RMI运行时则会要求得到新的执行过程。

这表明,政策永远是动态的。

您要想修改政策,就只需简单地编写通用政策接口的新的执行程序,把它安装在服务器上,并对服务器进行配置以返回这种新类型的对象即可。

这样,每台客户机都会根据新的政策对新的开支报告进行检查。

这是一种比任何静态方法都更好的方法,原因如下:∙所有客户机不必暂停或用新的软件来升级--软件可根据需要在不工作时加以更新。

∙服务器不必参与项目检查工作,该工作可在本地完成。

∙允许动态限制,因为对象执行程序(而不仅仅是数据)是在客户机和服务器之间进行传递的。

∙使用户能立刻看到错误。

使客户机在服务器上所能调用的方法的远程接口定义如下:import java.rmi.*;public interface ExpenseServer extends Remote {Policy getPolicy() throws RemoteException;void submitReport(ExpenseReport report)throws RemoteException, InvalidReportException;}import语句输入Java RMI包。

所有RMI类型均在包java.rmi或其子包内定义。

接口ExpenseServer是一般的Java接口,具有如下两种有趣的特点:它扩展了名为Remote的RMI接口,这使该接口标记为可用于远程调用。

它的所有方法均抛出RemoteException,后者用来表示网络或信息故障。

远程方法还可抛出您所需要的任何其他例外,但至少必须抛出RemoteException,这样您才能处理只会在分布式系统中发生的错误状态。

该接口本身支持两个方法:getPolicy (返回一个实现政策接口的对象),和submitReport (提交一个完成的开支请求,并在报告无论因何种原因使表格出现错误时,抛出一个例外)。

政策接口本身可声明一种使客户机知道能否在开支报告中添加一个项目的方法:public interface Policy {void checkValid (Expenseentry entry)throws PolicyViolationException;}如果该项目有效--即符合当前政策,则该方法可正常返回。

否则就会抛出一个描述该错误的例外。

政策接口是本地的(而非远程的),所以将通过本机对象在客户机上执行--在客户机的虚拟机上,而非整个网络上运行的对象。

相关文档
最新文档