[转]Java RMI之HelloWorld篇


======================================================
注:本文源代码点此下载
======================================================

评论

2212500

#1楼[楼主]

2011-10-03 07:55

freeliver54

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

freeliver54

源代码已经写好了,把这四个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^)/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值