JAVA-RMI的分布式应用
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://tscjsj.blog.51cto.com/412451/85770 |
这些日子一直在研究SOAP--WebService的东东,发现和JAVA-RMI很相似,他们两个都是基于RPC(Remote Procedure Call)风格。如果想学习SOAP-WebService的朋友,建议先看看JAVA-RMI的知识,自己动手做个HelloWorld,体会一下。一定会对你理解SOAP-WebService有帮助的。
一.先解释一下什么是RPC
一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用过程接收答复信息,获得进程结果,然后调用执行继续进行。
二.下面详细讲解JAVA-RMI分布式应用
用RMI编写一个分布式应用,核心有以下三方面:
1.定位远程对象
-- 一个应用可以利用RMI的名字服务功能注册器远程对象。
-- 可以象操作本地普通对象一样传送并返回一个远程对象的引用
2.与远程对象通信:
-- 底层的通信由RMI实现,对于系统开发人员来说,远程调用和标准的Java方法调
用没有什么区别。
3.为需要传递的对象装载类的字节码
-- RMI允许调用者向远程对象传递一个对象,因此RMI提供这种装载对象的机制。
下图是JAVA-RMI过程调用图
![]() ![]() RMI远程接口:
远程对象必须继承远程接口,确定那些方法是远程方法,为此定义远程接口,远程接口只负责提供方法名,不提供实现细节,因此必须由一个对象来实现接口。
一般来说,实现一个远程接口的类至少有以下步骤:
1.声明远程接口
2.为远程对象定义构造函数
3.实现远程方法
参数传递规则:
1.远程对象通常通过引用传递,一个远程对象的引用是一个stub,它是客户端的代理,它实现远程对象中的远程接口的内容。
2.本地对象通过串行化拷贝到目的,如果不作制定,对象的所有成员都将被拷贝。
下面是实现JAVA-RMI程序
分为以下四个步骤:
1.创建远程接口及声明远程方法(HelloInterface.java)
2.实现远程接口及远程方法(继承UnicastRemoteObject)(Hello.java)
3.启动RMI注册服务,并注册远程对象(HelloServer.java) 4.客户端查找远程对象,并调用远程方法(HelloClient.java) 最后执行程序:启动服务HelloServer;运行客户端HelloClient进行调用
1.创建远程接口及声明远程方法(HelloInterface.java)
package test.rmi; import java.rmi.*; /** * 远程接口必须扩展接口java.rmi.Remote */ public interface HelloInterface extends Remote { /** * 远程接口方法必须抛出 java.rmi.RemoteException */ public String say() throws RemoteException; } 2.实现远程接口及远程方法(继承UnicastRemoteObject)(Hello.java)
package test.rmi; import java.rmi.*; import java.rmi.server.*; public class Hello extends UnicastRemoteObject implements HelloInterface { private String message; public Hello(String msg) throws RemoteException { message = msg; } public String say()throws RemoteException{ System.out.println("Called by HelloClient"); return message; } } 3.启动RMI注册服务,并注册远程对象(HelloServer.java) package test.rmi; import java.rmi.Naming; import java.rmi.registry.LocateRegistry; public class HelloServer { /** * 启动 RMI 注册服务并进行对象注册 */ public static void main(String[] argv) { try { //启动RMI注册服务,指定端口为1099 (1099为默认端口) //也可以通过命令 $java_home/bin/rmiregistry 1099启动 //这里用这种方式避免了再打开一个DOS窗口 //而且用命令rmiregistry启动注册服务还必须事先用RMIC生成一个stub类为它所用 LocateRegistry.createRegistry(1099); //创建远程对象的一个或多个实例,下面是hello对象 //可以用不同名字注册不同的实例 HelloInterface hello = new Hello("Hello, world!"); //把hello注册到RMI注册服务器上,命名为Hello Naming.rebind("Hello", hello); //如果要把hello实例注册到另一台启动了RMI注册服务的机器上 //Naming.rebind("//192.168.1.105:1099/Hello",hello); System.out.println("Hello Server is ready."); } catch (Exception e) { System.out.println("Hello Server failed: " + e); } } } 4.客户端查找远程对象,并调用远程方法(HelloClient.java)
package test.rmi;
import java.rmi.Naming; public class HelloClient { /** * 查找远程对象并调用远程方法 */ public static void main(String[] argv) { try { HelloInterface hello = (HelloInterface) Naming.lookup("Hello"); //如果要从另一台启动了RMI注册服务的机器上查找hello实例 //HelloInterface hello = (HelloInterface)Naming.lookup("//192. 168.1.105:1099/Hello"); //调用远程方法 System.out.println(hello.say()); } catch (Exception e) { System.out.println("HelloClient exception: " + e); } } } 源代码已经写好了,把这四个java文件编译成class文件
G:\workspace\src\testrmi\src\test\rmi>javac *.java
(1)打开一个Dos窗口执行命令 java test.rmi.HelloServer 这就算启动了服务HelloServer
G:\workspace\src\testrmi>java test.rmi.HelloServer
Hello Server is ready. 运行成功则可以看到 Hello Server is ready (2)打开另一个Dos窗口执行命令 java test.rmi.HelloClient运行客户端程序 G:\workspace\src\testrmi>java test.rmi.HelloClient Hello, world! 调用成功则可以看到 Hello, world! 本文出自 “唐大老师” 博客,请务必保留此出处http://tscjsj.blog.51cto.com/412451/85770 本文出自 51CTO.COM技术博客 |
附件下载:
JAVA-RMI程序
JAVA-RMI程序



lidapeng
博客统计信息
热门文章
最新评论
友情链接

