javarmi教程:入门与编译方法远程(代码片段)

九师兄 九师兄     2022-11-30     551

关键词:

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 Server
 Server is running...

运行客户端:

$ java Client
Hello Monica
  this is a message from Remote Method
Hello Joy
   this is a message from Remote Method
Hello Ross
   this is a message from Remote Method
Hello Chandler
  this 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 "

javarmi地址解析问题(代码片段)

我正在尝试重新编写一些基本的设计模式。我只有代码片段,没有完整的运行代码示例。一种叫做代理模式。我只想通过远程调用方法。这是我的简单代码:WebService.JavapublicclassWebServiceextendsUnicastRemoteObjectimplementsIRemoteprivatestaticf... 查看详情

jquery入门与实践案例教程(代码片段)

为什么要学jquery使用javascript开发过程中,有许多的缺点:查找元素的方法单一,麻烦。遍历数组很麻烦,通常要嵌套一大堆的for循环。有兼容性问题。想要实现简单的动画效果,也很麻烦代码冗余。体验jquery... 查看详情

androidstudiondk入门教程--java与c++之间的类型签名(代码片段)

概述本文主要介绍Java与C++通信时函数的签名关系方法签名我们可以在生成的头文件中看到每个方法上面都有如下注释:/**Class:com_example_wastrel_hellojni_HelloJNI*Method:getFormCString*Signature:()Ljava/lang/String;*/JNIEXPORTjstringJNICALLJava 查看详情

git入门教程之本地和远程仓库的本质(代码片段)

本地仓库和远程仓库在本质上没有太大区别,只不过一个是本地电脑,一个是远程电脑.远程仓库不一定非得是github那种专门的"中央服务器",甚至局域网的另外一台电脑也可以充当"中央服务器"的角色,因为它存在的最... 查看详情

jenkins入门教程(代码片段)

  jenkins是一个广泛用于持续构建的可视化web工具,持续构建说得更直白点,就是各种项目的"自动化"编译、打包、分发部署。jenkins可以很好的支持各种语言(比如:java,c#,php等)的项目构建,也完全兼容ant、maven、gradle等多种... 查看详情

androidstudiondk入门教程--jni签名验证防止恶意调用(代码片段)

概述根据前面的文章来看,JNI其实只实现了关键代码加密,如果别人拿到了你的JavaNative方法定义和对应的so,即可完成对你so里方法的调。因为native方法和类都是不能混淆的,混淆了方法的函数名就变了,调用... 查看详情

树莓派初入门:ssh远程登录与vnc远程桌面(代码片段)

前言:本文主要讲解,对于一个无树莓派显示屏,无键盘,无鼠标,手边只有手机,电脑和一个已烧录好raspbian-stretch系统的树莓派3B+的玩家,如何进行远程登录,进而可以进程桌面的连接。 工具:1、手机(目的是开启一个... 查看详情

vs2017编译并配置libcurl入门教程(代码片段)

libcurl可以用来发送http请求,是c/c++发送http请求常用的库下载libcurl源码包:libcurl下载地址:https://curl.haxx.se/download.html解压到C:\source\repos\libcurl\curl-7.60.0打开curl文件夹,以管理员权限运行buildconf.bat。编译libcurl源码选择【开始】-&... 查看详情

node.js使用教程-2.gulp打包构建入门与使用(代码片段)

前言gulp是一个前端项目开发的自动化打包构建工具,类似的打包工具还有webpack。前端开发的过程中,会写到js文件,css文件,我们的项目如果想上线,那么一定要体积小一点,就需要对原始的代码进行编译压缩... 查看详情

latex:入门教程(代码片段)

http://blog.csdn.net/pipisorry/article/details/54571521总的来说,LaTex是一套排版系统,与word那种所见即所得对排版方式不太,用LaTex排版更像是写程序一样,将想要的排版效果用指令写出来,再通过LaTex编译成文档。简单... 查看详情

vue2.5入门教程(代码片段)

文章目录1、课程介绍2、Vue基础语法2-1、创建第一个Vue实例2-2、挂载点,模板与实例2-3、Vue实例中的数据,事件和方法2-4、Vue中属性绑定和双向数据绑定2-5、Vue中的计算属性和侦听器2-6、v-if,v-show与v-for指令3、Vue中的... 查看详情

javarmi(代码片段)

查看详情

面试题思考:javarmi与rpc,jms的比较

RPC:(RemoteProcedureCall)   被设计为在应用程序间通信的平台中立的方式,它不理会操作系统之间以及语言之间的差异。支持多语言RMI:(RemoteMethodInvocation) RPC的Java版本,EJB的基础技术 RMI采用JRMP(JavaRemoteMethodProt... 查看详情

tomcat和servlet快速入门教程!!!(代码片段)

Tomact和servlet快速入门教程tomcat的入门必备知识1.下载:2.安装:解压压缩包即可3.卸载:删除目录即可4.启动:5.关闭:6.部署:静态项目和动态项目将tomcat集成到IDEA中,并且创建JavaEE项目,部署项目Servletweb动态工程目录介绍热部署快速... 查看详情

4-java安全基础——rmi远程调用(代码片段)

1.RMI远程调用javaRMI(JavaRemoteMethodInvocation)即远程方法调用,是分布式编程中的一种编程思想,javajdk1.2就开始支持RMI,通过RMI可以实现一个虚拟机中的对象调用另一个虚拟机上中的对象的方法,并且这两个虚拟机可... 查看详情

4-java安全基础——rmi远程调用(代码片段)

1.RMI远程调用javaRMI(JavaRemoteMethodInvocation)即远程方法调用,是分布式编程中的一种编程思想,javajdk1.2就开始支持RMI,通过RMI可以实现一个虚拟机中的对象调用另一个虚拟机上中的对象的方法,并且这两个虚拟机可... 查看详情

springrmi解析1-使用示例

Java远程方法调用,即JavaRMI(Java RemoteMethodInvocation),是Java编程语言里一种用于实现远程过程调用的应用程序编程接口。它使客户机上的运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络... 查看详情

对javarmi的认识

RMI的定义RPC(RemoteProcedureCall):远程方法调用,用于一个进程调用另一个进程中的过程,从而提供了过程的分布能力。RMI(RemoteMethodInvocation):远程方法调用,即在RPC的基础上有向前迈进了一步,提供分布式对象间的通讯。允许运行... 查看详情