1.概述

转载:RMI教程:入门与编译方法

2.分布式对象和RMI

分布式对象技术主要是在分布式异构环境下简历应用系统框架和对象构件。在应用系统框架的支撑下,开发者可以将软件功能封装为更易于管理和使用的对象,这些对象可以跨越不同的软、硬件平台进行互操作。目前,分布式互操作标准主要有Microsoft的COM/DCOM标准、Oracle(前Sun)公司的Java RMI标准、OMG组织的CORBRA标准。

在Java中RMI在包java.rmi和java.rmi.server中。RMI是开发网络应用程序的一种强有力的技术,而不用担心底层的网络细节。RMI凭借一个更为通用的原创对象模型胜过了C/S模型。在这个模型里,有服务器定义客户端可以远程使用的对象,就好像它确实是一个运行在和客户端相同的环境下的本地对象。RMI隐藏了底层的有关传输方法参数和通过网络返回方法返回值的机制。一个参数或者返回值可以是一个简单值或者任何Serializable(可序列化:即对象可以转化成文件,存储在磁盘上)对象。

3.RMI程序构成

远程方法调用RMI是jdk 1.1 中引入的分布式对象软件包,他的出现大的简化了分布异构环境中Java应用程序直接的通信。

要开发一个基于RMI的应用程序,必须创建四个主要的类:

远程对象接口(例: RMethod)

这个接口中包含了所有远程方法的声明。在实际使用中,客户端只知道这个接口的存在,并不关心这个接口是如何实现的

它扩展了java.rmi.Remote接口,定义了远程对象执行的输出方法。该接口的每个方法都必须定义为抛出一个java.rmi.RemoteException异常,它是许多更专门的RMI异常类的父类。每个远程方法都必须声明为可以RemoteException移除,因为在通过网络调用远程方法的过程中,有很多意想不到的问题可能会引发错误。

远程对象实现(例: RMethodImpl)

这是远程对象接口(RMethod)的具体实现。它包含了实现远程接口的具体代码,可以在这些远程方法的实现代码中加入一些输出语句(或者log4j),以测试其被调用的情况。

这个类同时是java.rmi.server.UnicastRemoteObject的子类。它代表了远程对象或者服务器对象。与声明远程方法来抛出RemoteException对象不同,该远程对象不需要做任何专门的事情来允许它的方法被远程调用。UnicastRemoteObject和RMI其余的基本结构将自动进行处理。

RMI服务器端(例:Server)

RMI服务器端生成远程对象的一个实例,并用一个专用的URL进行注册。

在注册时,首先要提供远程对象所在服务器的地址,同时需要对远程对象进行标识,也就是给远程对象一个名字。这个对象在服务器端和客户端必须一致,这样客户端才能找到服务器端的远程对象。

服务器地址(serverAddress)+ 远程对象名字(objectName)

构成了RMI的注册URL。其具体形式为:

rmi://serverAddress:port/objectName

端口号可以自己定义,默认端口是1099。如果使用默认端口,在URL里面可以不用给出。下面是一个URL的例子:

rmi://192.168.1.123:2222/RemoteMethod

RMI客户端(例:Client)

RMI客户端在远程RMI服务器端上查找服务对象,并将它转换成本地接口类型,然后像对待一个本地对象一样使用它。

4.应用实例详解

下面是一个简单的RMI实例,RMI客户端通过RMI服务器端提供的方法输出一个语句。例子虽然简单,但是涵盖了Java RMI调用的基本原理的方法。在实现复杂应用时,我们需要做的也只是完善远程对象的实现类而已。

4.1 系统模型

4.2 具体实现

远程对象接口(RMethod.java)

这里作为实现,只定义了一个远程方法,在实际应用中,我们可以定义很多的远程方法,一起完成我们需要的功能。

import java.rmi.*;
public interface RMethod extends Remote {String sayHello(String name) throws RemoteException;
}

远程对象实现(RMethodImpl.java)

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class RMethodImpl extends UnicastRemoteObject implements RMethod {public RMethodImpl() throws RemoteException {super();}public synchronized String sayHello(String name) throws RemoteException {System.out.println("Client-" + name + ": invoking \" sayHello \"");return "Hello " + name + "\n this is a message from Remote Method";}
}

公共配置接口(Config.java)

在这个接口定义了服务器和客户端共同使用的配置信息。这样,让某些信息变化时,只需要修改该接口,而不用去修改其他代码。

public interface Config {String OBJECT_NAME = "RemoteMethod";String SERVER_IP = "127.0.0.1";int PORT = 1234;
}

RMI服务器端(Server.java)

服务器端的主要任务是创建远程对象实现的实例,并按照公用配置文件制定的对象名将这个实例注册到服务器端上。

当注册成功之后,服务器端程序就处于阻塞状态,等待客户端的远程对象访问请求。

import java.rmi.*;
import java.rmi.registry.*;
public class Server {public static void main(String[] args){new Server();}public Server(){if (null == System.getSecurityManager()) {System.setSecurityManager(new RMISecurityManager());}try {try {LocateRegistry.createRegistry(Config.PORT);} catch (java.rmi.server.ExportException ex) {System.out.println("Register the port failed:\n" + ex.getMessage());}RMethod rm = new RMethodImpl();String objAddr = "rmi://" + Config.SERVER_IP+ ":" + Config.PORT+ "/" + Config.OBJECT_NAME;java.rmi.Naming.rebind(objAddr, rm);System.out.println("Server is running...");} catch (Exception e) {System.out.println("Server startup failed!");e.printStackTrace();}}
}

RMI客户端(Client.java)

客户端通过调用服务器端提供的远程方法,来实现与服务器的通信。这样就不需要考虑具体的通信细节。只要像使用本地方法一样调用服务器端的远程方法,完成需要的功能。

要调用远程方法,客户端必须先构造一个RMI URL来找到远程对象(注意在服务器端我们只使用远程对象接口),然后通过远程对象来调用远程方法。

public class Client {private String name;private String hostURL;private String obj;public Client(String name){this.name = name;hostURL = "rmi://" + Config.SERVER_IP + ":" + Config.PORT + "/";this.obj = Config.OBJECT_NAME;}public void callRMethod(){try{RMethod rm = (RMethod) java.rmi.Naming.lookup(hostURL + obj);String result = rm.sayHello(name);System.out.println(result);} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {Client c1 = new Client("Monica");c1.callRMethod();Client c2 = new Client("Joy");c2.callRMethod();Client c3 = new Client("Ross");c3.callRMethod();Client c4 = new Client("Chandler");c4.callRMethod();}
}

安全策略文件(java.policy)

由于Java内置的安全策略对远程方法调用有一定的限制,所以我们必须编写一个安全策略文件(这是一个文本文件,文件名可以随便起)。在启动服务器端时把策略文件加载到虚拟机中,这样服务器端侧才能正常运行。

策略文件内容如下:

grant {permission java.security.AllPermission;
};

不然会报错

Server startup failed!
java.security.AccessControlException: access denied ("java.net.SocketPermission" "localhost:1234" "listen,resolve")at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)at java.security.AccessController.checkPermission(AccessController.java:886)

4.3 编译已经运行方式

假设所有的文件都在同一个目录下。

4.4 命令行模式

编译:

$ javac *.java

运行服务器端:

$ rmic RMethodImpl
$ java -Djava.security.policy=java.policy ServerServer is running...

运行客户端:

$ java Client
Hello Monicathis is a message from Remote Method
Hello Joythis is a message from Remote Method
Hello Rossthis is a message from Remote Method
Hello Chandlerthis is a message from Remote Method

服务器端对应的输出为:

$ java -Djava.security.policy=java.policy Server
Server is running...
Client-Monica: invoking " sayHello "
Client-Joy: invoking " sayHello "
Client-Ross: invoking " sayHello "
Client-Chandler: invoking " sayHello "

【java】RMI教程:入门与编译方法 远程相关推荐

  1. Java培训教程:”==“和 equals 方法究竟有什么区别?

    在学习java技术过程中,我们会接触到一些变量值的相关知识,本期小编为大家介绍的教程就是关于"=="和 equals 方法究竟有什么区别?来看看下面的详细介绍. Java培训教程: ...

  2. Java开发教程入门!数据库事务深入分析

    咱先来聊聊Redis 像Redis的基础入门,掌握下图这几个列出来的知识点足以了. 进阶的话,就得下点功夫了,事务.主从复制.哨兵.集群等等之类的搞不明白你就上不去呀. 再看美团亿级流量Redis实战 ...

  3. java基础教程42讲:方法的参数传递机制

    java里的方法不能单独存在,调用方法我们使用类或者对象.调用static方法使用类,因为它是属于类级别的方法. 没有static的普通方法,使用对象进行调用,不能使用类直接调用,它是属于对象级别的. ...

  4. java基础教程传值_Java基础——方法传值(基本数据类型 VS 引用数据类型)

    总结--基本数据类型传值,引用类型传地址 在Java语言中,不管参数的类型是引用类型还是基本数据类型,数据参数和形式参数进行值传递的方式只有一种--参数值的值 复制一份 赋值给形式参数 所以,实参的值 ...

  5. java 俄罗斯方块 教程_java俄罗斯方块制作方法 全面哦

    展开全部 代码多了,传不过去 分开给你传吧 还是发你邮箱吧 下面是一部分代码 代码如下: package com.tarena.tetris;//包名倒636f70793231313335323631 ...

  6. Java开发教程入门!java核心技术卷一

    前言 不想当将军的士兵不是好士兵,这句话对于程序员来说同样适用,不想成为大牛的程序员不是好程序员.做为一个IT的新人,要想成为技术大牛要怎么做,怎样能快速成长.我们来看看过来人的分享. 简单来讲,成为 ...

  7. java rmi 入门实例

    java rmi 入门实例 (2009-06-16 16:07:55) 转载▼ 标签: java rmi 杂谈 分类: java-基础  java rmi即java远程接口调用,实现了2台虚拟机之间的 ...

  8. Java RMI远程方法调用详解

    Java RMI远程方法调用详解     [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/51992182 一.Java R ...

  9. (转)Java RMI远程方法调用详解

    Java RMI远程方法调用详解 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/51992182 一.Java RMI机制 ...

最新文章

  1. ArXiv 2020 | 抖音“变身漫画”滤镜背后的技术,难道来自这篇论文?
  2. Struts+Spring+Hibernate练习(完整)(1)
  3. 业界资讯:Alternativa 3D 7 免费
  4. UA MATH566 统计理论1 充分统计量
  5. 数据结构:二叉搜索树(BST)的基本操作
  6. [git]git忽略文件
  7. 清除dns缓存命令行_怎么防止移动dns劫持,防止移动dns劫持要先了解什么是dns劫持...
  8. [Java基础]比较器排序Comparator的使用
  9. java isempty_Java ArrayDeque isEmpty()方法与示例
  10. Linux---多线程
  11. 阿里云自研数据仓库 AnalyticDB 再捧 TPC 全球冠军
  12. 关于jQuery、AJAX、JSON(一)
  13. 在struts中实现验证码
  14. 《无人机DIY》——2.11 三轴直升机
  15. 庄子:谁知南华秋水意?
  16. 【注意力机制集锦2】BAMSGEDAN原文、结构、源码详解
  17. 去你的35岁危机|ONES 人物
  18. 互联网项目,京东店群、淘宝店群和天猫无货源店群,创业者该如何选择?
  19. 手工测试1年经验面试,张口要13K,我真是服了····
  20. 【论文翻译】 BMN: Boundary-Matching Network for Temporal Action Proposal Generation

热门文章

  1. 3299元起!结缘梅奔F1车队,Redmi K50电竞版发布
  2. 蔚来ET5将于2022年9月开启交付 补贴前售价32.8万元起
  3. 华为鸿蒙平板MatePad Pro 2支持多屏协同突破
  4. 三年白干!程序员因违反《竞业协议》赔偿腾讯97.6万元,返还15.8万元
  5. 雷军:到了40岁觉得自己一事无成
  6. 你会换吗?报告称将有大批iPhone用户升级苹果5G新机
  7. 字节跳动经营范围新增销售电子产品家用电器等
  8. 互联网人求职现状:逃离互联网的人增多 求稳可以牺牲涨薪
  9. 腾讯又双叒涨工资了!平均月薪已达7.27万?
  10. 2000元档855旗舰来了 网友:都过时了,哪有人买