======================================================
注:本文源代码点此下载
======================================================
评论
2212500
#1楼[楼主]
2011-10-03 07:55
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提供这种装载对象的机制。
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);
}
}
}
回复 引用 查看
#2楼[楼主]
2011-10-03 07:55
源代码已经写好了,把这四个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!
回复 引用 查看
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/