RMI(Remote Method Invocation 远程方法调用),它增强了JAVA开发分布式应用的能力。
运行机制;
RMI应用程序通常包括两个独立的程序:服务器程序和客户端程序。典型的服务器应用程序将创建多个远程对象,使这些远程对象能够被引用,然后等待客户端调用这些远程对象的方法,而典型的客户端程序则从服务器中得到一个或多个远程对象的引用,然后调用远程对象的方法。RMI为服务器和客户端进行通信和信息传递提供了一种机制。
在RMI分布式应用系统中,服务器与客户机之间传递的JAVA对象必须是可序列化的对象。不可序列化的对象不能在对象流中进行传递。对象序列化扩展了核心JAVA输入/输出类,同时也支持对象。对象序列化支持把对象编码以及将通过它们可访问到的对象编码变成字节流;同时,它也支持流中对象图形的互补重构造。
开发步骤:
在这里推荐一款PLUG-IN FOR ECLIPSE,http://www.genady.net/rmi/v20/,可以提供自动生成STUB和发布RMI,生成security.policy的作用。其站定也提供了一个DEMO,比较简单。
服务端:首先定义REMOTE接口
public interface RemotePrinter extends Remote {
public int sumbitJob(String text) throws RemoteException;
/**
*
* @param jobID the job id returned from {@link #sumbitJob(String)}
* @return
* @throws RemoteException
*/
public boolean isComplete(int jobID) throws RemoteException;
public String getPrinterStatus() throws RemoteException;
}
所有的远程方法都需要启动REMOTEEXCEPTION方法,执行异常检查。远程对象必须实现此接口
public class RemotePrinterImpl extends UnicastRemoteObject implements
RemotePrinter {
protected RemotePrinterImpl() throws RemoteException {
}
/**
*
*/
private static final long serialVersionUID = -693485476235003575L;
public String getPrinterStatus() throws RemoteException {
return "ddddd";
}
public boolean isComplete(int jobID) throws RemoteException {
System.out.println("requested printer status");
return true;
}
public int sumbitJob(String text) throws RemoteException {
System.out.println("submitted job"+text);
return 0;
}
}
该具体实现集成了UnicastRemoteObject和实现创建的远程对象的类;
如果你使用的IDE实现,将自动编译,并利用上文中提到了RMI的PLUGIN来完成STUB的生成。如果是利用JDK的相关命令,比较繁琐,在此不介绍。
运行服务端程序
public static void main(String[] args)
{
try {
System.setProperty("java.rmi.server.hostname","192.168.2.176"); //设置服务器IP
Registry r = LocateRegistry.createRegistry(2000);//创建RMI的启动端口,默认并非此端口。
r.rebind("printer", new RemotePrinterImpl());//绑定对象
System.out.println("printer starting!");
} catch (Exception e) {
e.printStackTrace();
}
}
利用此CREATE方法就不需要在CMD中启动RMI的端口设置了。
关于客户端程序:
public class PrintClient {
public static void main(String[] args)
{
try {
System.setSecurityManager(new RMISecurityManager());//加入此方法必须存在security.policy文件
RemotePrinter printer = (RemotePrinter) Naming.lookup("rmi://192.168.2.176:2000/printer");
int jobID = printer.sumbitJob("hello world");
System.out.println("submitted job "+jobID);
System.out.println("Is job complete?"+printer.isComplete(jobID));
System.out.println("printer status?"+printer.getPrinterStatus());
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意,在真实场景发布时需要将远程接口打包成JAR发布到客户端;否则将造成客户端无法找到需要的远程接口。
分享到:
相关推荐
RMI的基础规范,关于RMI方面的规范知识
有关rmi的一些知识以及经典例子(编译通过)
rmi不可多得的学习材料!
rmi基础知识学习笔记,从最简单的例子讲述rmi的用途
基于RMI的java聊天室,实现群聊私聊,界面友好简单易用。源码适合初学者学习。这个简单的工程已涵盖大部分RMI知识你你学习RMI不错的选择。
详细介绍了JAVA RMI 的知识,不可多得的文档。长达60页,很详尽。对于java远程调用和分布式开发很有帮助。
在基础知识基本搞定的基础上,我开始了配置环境,经过两天的奋斗,rmi环境配置终于以失败告终,然后一脸遗憾的去问同学,得到的回答是rmi要配置环境?我一脸懵逼,不要配置环境,jar又放不进去,eclipse又不是神仙,...
Java RMI 会话 2 Java RMI(Remote Method Invocation),是Java开发的一种调用远程方法的技术。... 面向对象编程的中级知识。在 Eclipse 中安装: 克隆存储库。 在 Eclipse 中创建 在存储库中克隆的项目之
面向对象编程的中级知识。 在 Eclipse 中安装: 克隆存储库。 在 Eclipse 中创建 在存储库中克隆的项目之上创建新项目,最好使用相同的名称。 客户 界面 服务器 添加路径:在Server项目上,右击选择“ Build ...
讲述利用java rmi进行分布式应用开发的相关知识
关于中间件的一些基础知识,比如什么是RMI?什么是JNDI?等相关概念的一些介绍
架构师的前置知识有dubbo_ demo、角色_ RPC_原理 _RMI这些。。。。。。。。。。。。。。。。。。。。。。。
Excavator(挖掘机)是一个分布式的Java RMI框架。(求项目使用,有兴趣的可以电邮oldmanpushcart@gmail.com) 软件开发设计:应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等语言...
JAVA中最简单的分布式调用RMI共12页.pdf.zip
攻击工具,但是即使使用这些工具,成功的零知识攻击也依赖于显着的蛮力攻击(~64 位/9 quintillion 可能性)通过网络进行。 BaRMIe 的目标是使安全专业人员能够识别、攻击和保护不安全的 RMI 服务。 使用现有软件的...
J2EE简介及学习方法 J2EE基础技术 XML、RMI、JNDI 、JMS
rmi:// 6 hessian:// 6 http:// 7 webservice:// 7 thrift:// 7 memcached:// 7 redis:// 7 rest:// 7 服务之间的调用是阻塞的吗 7 同步调用 8 异步调用 8 Dubbo默认使用什么注册中心,还有别的选择吗? 9 Dubbo序列...
JAVA笔试总结 非常全面 基本上囊括了Java所有常考知识点,并且每个知识点都有详细解释。 知识点主要包括: native,transient,volatile,strictfp,CMM,...JDBC驱动,加密解密与安全架构,RMI/IIOP, JTA, JDO等等。
The RMI Programming Model 846 Parameters and Return Values in Remote Methods 856 Remote Object Activation 865 Web Services and JAX-WS 871 Chapter 11: Scripting, Compiling, and Annotation ...