`

RMI客户端调用远程服务器方法-远程方法调用

阅读更多

RMI软件下载:http://www.genady.net/rmi/v20/demos/

注意下载对应eclipse版本的RMI插件:http://www.genady.net/rmi/v20/downloads.html

因为如果插件版本与eclipse不一样可能会报以下错误:

Unable to use launch shortcut 

Reason: Plug-in net.genady.rmi was unable to load class net.genady.rmi.launching.ui.RMIServerLaunchShortcut. 

org/eclipse/jdt/debug/ui/launchConfigurations/JavaApplicationLaunchShortcut 

 

Demo查看:http://www.genady.net/rmi/v20/demos/

对着这个demo一步步操作就会得到三个项目。注意demo中的操作。

先看一下RMI基本原理:

结合实例看一下RMI开发的主要步骤:

一个正常工作的RMI系统由下面几个部分组成:
•  远程服务的接口定义 
•  远程服务接口的具体实现 
•  Stub 和 Skeleton 文件 
•  一个运行远程服务的服务器 
•  一个RMI命名服务,它允许客户端去发现这个远程服务 
•  类文件的提供者(一个HTTP或者FTP服务器) 
•  一个需要这个远程服务的客户端程序 

 

1、编写并且编译接口的Java代码
2、编写并且编译接口实现的Java代码
3、从接口实现类中生成 Stub 和 Skeleton 类文件
4、编写远程服务的主运行程序
5、编写RMI的客户端程序
6、安装并且运行RMI系统

 类图如下:

具体构建步骤可以看:http://www.genady.net/rmi/v20/demos/分别创建接口文件,接口的实现文件;以及服务端文件,客户端代码;

再运行注册服务器,最后运行服务端代码,再运行客户端代码看是否成功调用服务端方法。

附件中有rmi相关文章及示例代码。

 

下面太概列一下自己的步骤方便查看:

首先安装eclipse的rmi插件,下载对应eclipse版本的rmi插件。:

建立公共项目,里面就只有一个接口文件,因为服务端和客户端都要用到,所以建立这个公共项目了。

项目名:print-common

文件:RemotePrinter .java

package demo.rmi.print.common;

import java.rmi.Remote;
import java.rmi.RemoteException;


public interface RemotePrinter extends Remote {

	public String add(String str1, String str2) throws RemoteException;
}

 

下面建立服务端项目:

项目名:print-server

接口实现类:RemotePrinterImpl.java

package demo.rmi.print.server;

import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

import demo.rmi.print.common.RemotePrinter;

public class RemotePrinterImpl extends UnicastRemoteObject implements
		RemotePrinter {

	public RemotePrinterImpl() throws RemoteException{
		
	}
	@Override
	public String add(String str1, String str2) throws RemoteException {
		System.out.print("add method has een called");
		return str1 + str2;
	}

	

}

 注意接口实现类继承了UnicastRemoteObject 类,需要定义构造方法并抛出异常。

在服务端新建类PrintServer.java用于启动服务,绑定方法。

package demo.rmi.print.server;

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class PrintServer {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try{
			Registry r = LocateRegistry.getRegistry();
			r.bind("printer", new RemotePrinterImpl());
			System.out.println("printer server is ready");
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

 

完了之后重要的一步:右键点击项目print-server找到RMI里面点Enable Stubs Gerneration,这样在编译后的文件夹目录会多出一个RemotePrinterImpl_Stub.class;

右键点击项目print-server找到Properties,点RMI Compiler Properties.勾选-keep选项,在源代码目录产生RemotePrinterImpl_Stub.java类。此类使用代理模式运用反射机制生成。

下面新建项目print-client

客户端类:PrintClient.java

package demo.rmi.print.client;

import java.rmi.Naming;
import java.rmi.RMISecurityManager;

import demo.rmi.print.common.RemotePrinter;

public class PrintClient {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		try{
			System.setSecurityManager(new RMISecurityManager());
			RemotePrinter printer = (RemotePrinter)Naming.lookup("rmi://localhost/printer");
			String str  = printer.add("good", "str2");
			System.out.println(str);
		}catch(Exception e){
			e.printStackTrace();
		}
	}

}

 

注意使用了System.setSecurityManager(new RMISecurityManager());

好了。代码就这么多。如何运行?

1、先运行eclipse工具栏的rmi的start local registry

2、运行PrintServer.java,对该文件点右键Run as RMI Application,可以打开dialog,找到RMI VM Properties

在java.rmi.server.codebase,选择后点compute from classpath,得到相应内容后确定,run

3、运行客户端,PrintClient.java,对该文件点右键Run as RMI Application,可以打开dialog,找到RMI VM Properties在java.security.policy后面选择点create,确认后会在print-client项目下生成 security.policy文件点OK,RUN后打印出goodstr2,结果表明调用了服务器端的方法。远程调用成功。

 

 

上面写的是用RMI插件编码产生stub和Skel类文件,用过一段时间之后发现插件过期了,不行那怎么办呢?能不能手动编译呢?参考以下链接:

如何使用RMI:http://download.oracle.com/javase/1.5.0/docs/guide/rmi/hello/hello-world.html

如何编译生成文件:http://download.oracle.com/javase/1.5.0/docs/tooldocs/windows/rmic.html

编译方法:cmd控制台进入src目录,使用命令:rmic -g -keep -vcompat com.customs.GateServer

编译后产生了GateServer_Skel.class,GateServer_Skel.java,GateServer_Stub.class,GateServer_Stub.java文件。

  • rmi.rar (22.9 KB)
  • 下载次数: 10
分享到:
评论

相关推荐

    java RMI客户端调用远程服务器系统命令

    NULL 博文链接:https://skyandcity.iteye.com/blog/1547028

    RMI远程方法调用

    用JAVA程序实现RMI,实现客户端和服务器间的时间同步,并计算出两端的时间差

    通过Java RMI实现远程调用的一个简单例子

    源代码 博文链接:https://forchase.iteye.com/blog/1454428

    rmi远程方法的调用

    其根据一个简单示例来说明。。rmi 客户端,和远程服务器端

    RMI远程调用视频教材

    RMI是Remote Method Invocation(远程方法调用)的 所写。它允许一个Java程序调用网络中另一台计算机上的Java方法,...实现RMI调用的程序和被调用的方法,都必须是Java代码,即客户端和服务器端都必须通过纯Java实现。

    Python中实现远程调用(RPC、RMI)简单例子

    远程调用使得调用远程服务器的对象、方法的方式就和调用本地对象、方法的方式差不多,因为我们通过网络编程把这些都隐藏起来了。远程调用是分布式系统的基础。 远程调用一般分为两种,远程过程调用(RPC)和远程方法...

    RMI 跨平台调用的demo

    RMI跨平台调用的demo,客户端运行在Windows,服务器端运行在linux,测试通过

    rmi 远程方法调用

    rmi 成功实例。两个工程的远程调用。RMIServer是服务器端,RMIClient是客户端。创建两个工程,先开启服务器端。如是在两台机子上实验,请把客户端的请求ip改到你要连接的服务器的ip。

    Java中RMI远程调用

    它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨是尽可能简化远程接口对象的使用。  Java RMI极大地依赖于接口。在需要创建一个远程...

    Calculator-Java-RMI:Java 远程方法调用示例

    Java 远程方法调用 (Java RMI) 是一个 Java API,它执行远程过程调用 (RPC) 的面向对象等价物,支持序列化 Java 类的直接传输和分布式垃圾收集。 远程过程调用:消息传递远程过程调用 (RPC) 是一种允许程序调用位于...

    RMI.rar_remote_分布式 通信

    它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨就是尽可能简化远程接口对象的使用。 Java RMI极大地依赖于接口。在需要创建一个远程...

    rmi.js:JavaScript的远程方法调用(RMI)

    RMI.js是一些JavaScript客户端代码和Node.js模块的组合,该模块可以实现远程方法的隐式调用。 开发人员可以使用本地,远程或两者的方法定义对象,然后在客户端上调用它们。 框架将知道实现是存储在本地还是在服务器...

    RMI-2-master:RMI 第二部分

    从客户端调用要在服务器上执行的远程方法(RMI)。 服务器上的序列化( Marshalling )向客户端发送响应。 客户端接收响应并本地执行。 RMI的第二节是为了更好地理解RMI的Marshalling(对象序列化),在继续之前完成...

    java开发oa系统源码-webservice-learning:网络服务学习

    RMI远程方法调用,简单,资源少 CORBA 通用对象请求代理架构,IIOP 协议中的二进制数据交换 RMI-IIOP 远程方法调用 - Internet Inter-Ojbect 协议,结合 RMI 和 CORBA 的优势 COM+ 公共对象模型 SOAP 简单对象访问...

    remote-method-guesser:Java RMI漏洞扫描程序

    使用客户端指定的代码库调用远程方法(远程类加载攻击) 使用ysererial小工具或客户端指定的代码库执行DGC和注册表调用 对rmi注册表执行bind , unbind和rebind操作 使用绕过注册表筛选 枚举java.lang.String的解组...

    shell-plus::laptop_computer:ShellPlus是基于RMI的单一服务器管工具,由服务端,注册中心,客户端进行组成。该工具主要用于服务器管理,攻防后门安全测试以及技术研究,禁止用作非法犯罪

    RMI远方法程调用步骤:客户调用客户端辅助对象stub上的方法客户端辅助对象stub打包调用信息(变量,方法名),通过网络发送给服务端辅助对象骨架服务端辅助对象骨架将客户端辅助对象发送来的信息解包,找出真正被...

    RMI-master:第 1 部分 RMI

    从客户端调用要在服务器上执行的远程方法(RMI) 服务器上的序列化( Marshalling )向客户端发送响应 客户端接收响应并本地执行 内容 在开始之前 推荐工具: 蚀 Java 1.6 或更高版本。 面向对象编程的中级知识。 ...

Global site tag (gtag.js) - Google Analytics