`
xmong
  • 浏览: 258631 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java RMI

阅读更多
Java Rmi


目录
1 JAVA RMI 1
1.1 RMI简介 1
2 JAVA RMI的实现 1
2.1 JAVA RMI简单实现 1

1 Java RMI
1.1 RMI简介
Java RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。

RMI的工作原理:正常情况下,在同一个Java虚拟机中一个对象调用另一个对象的方法,要向该方法传递对象参数,以及获取方法返回值对象,这些都可以通过引用(指向Java虚拟机内存中的对象)来完成,这称为传引用。但是RMI远程调用方法是在不同虚拟机中来完成方法调用,这种传值方法就不适用了。因为不同Java虚拟机中同一个引用值指向的对象是不一样的,同时也可能不同的虚拟机引用的实现方式完全不同和不兼容。
因此为了实现向远程方法传递参数和获取远程方法返回结果,可以使用三种机制来实现,这取决于所传递的数据类型:
简单数据类型(int,Boolean,double等)是按值传递来完成的,这和本地java方法调用的值传递一样。
远程对象的引用(即实现了Remote接口的对象)是以远程引用(Remote Reference)传递来完成的,即允许接收方调用远程对象上的方法。这与本地java方法调用传递对象引用有些相似。
没有实现Remote接口的对象是按值来传递的,即通过对象序列化来传递整个对象的副本。
Java Rmi的通信机制就是根据上面传递机制来实现的。

2 JAVA RMI的实现
要实现RMI远程对象调用需要大部分类都在java.rmi,java.rmi.server和java.rmi.registry包中。
Java.rmi包定义了客户端所见的类,接口和异常。
Java.rmi.server包定义了服务器端可见的类,接口和异常。
Java.rmi.registry包定义了用于查找和命名远程对象的类,接口和异常。

2.1 Java RMI简单实现
HelloRmi:rmi服务接口
HelloRmiImpl:rmi服务实现类
Server:RMI服务器端类
Client:RMI客户端类

HelloRmi实现如下:

package com.rmi;

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

/**
 * 定义一个rmi服务接口,rmi接口必须继承Remote接口,
 * 其中需要远程调用的方法必须抛出RemoteException异常
 * @author xmong
 */
public interface HelloRmi extends Remote{
	
	/**
	 * 简单实现的say hi方法
	 * @param name 
	 * @return 
	 * @throws RemoteException
	 */
	public String sayHi(String name) throws RemoteException;

}


HelloRmiImpl实现如下:

package com.rmi;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

/**
 * rmi接口实现,rmi实现继承了UnicastRemoteObject类,
 * UnicastRemoteObject类提供了很多支持远程调用的方法。
 * @author xmong
 */
public class HelloRmiImpl extends UnicastRemoteObject implements HelloRmi{

	
	
	/**
	 * 序列化对象
	 */
	private static final long serialVersionUID = 1L;


	/**
	 * 因为UnicastRemoteObject的构造方法抛出了RemoteException异常,
	 * 因此这里默认的构造方法必须写,必须声明抛出RemoteException异常
	 * @throws RemoteException
	 */
	protected HelloRmiImpl() throws RemoteException {
		super();
	}

	/**
	 * 传入一个客户端名称字符串,对该名称问候,输出客户端名称和 ip
	 * 返回客户端名称“Server”
	 */
	@Override
	public String sayHi(String name) throws RemoteException{
		try {
			//UnicastRemoteObject的getClientHost()获取客户端主机名
			System.out.println("Server: Hi "+name+" "+getClientHost());
		} catch (ServerNotActiveException e) {
			e.printStackTrace();
		}
		return "Server";
	}

}


Server实现如下:

package com.rmi;

import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;

/**
 * 创建RMI注册表,启动RMI服务,并将远程对象注册到RMI注册表中。
 * @author xmong
 */
public class Server {

	
	public static void main(String[] args) {
		
		try {
			//创建远程服务对象
			HelloRmi hr = new HelloRmiImpl();
			/**
			 * 在本机上注册远程服务端口9999,这一步必不可少,
			 * 缺少注册表创建,则无法绑定远程服务对象到远程注册表上 ,启动时会抛出Connection refused异常。
			 * java默认端口为1099,可以通过Registry.REGISTRY_PORT来获取这个值
			 */

			LocateRegistry.createRegistry(9999);
			/**
			 * 把远程服务对象注册到服务器上命名为:hello
			 * /绑定的URL标准格式为:rmi://host:port/name
			 * 其中协议名可以省略,即[rmi:]可以省去
			 */
			Naming.bind("rmi://localhost:9999/hello", hr);
			System.out.println("Rmi Server bind success");
		} catch (RemoteException e) {
			System.out.println("创建远程服务对象异常!");
			e.printStackTrace();
		} catch (MalformedURLException e) {
			System.out.println("绑定远程URL发生异常!");
			e.printStackTrace();
		} catch (AlreadyBoundException e) {
			System.out.println("发生重复绑定异常!");
			e.printStackTrace();
		}
		
	}
}

Client实现如下:

package com.rmi;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

/**
 * 客户端测试,客户端远程访问服务对象方法。
 * @author xmong
 */
public class Client {

	
	public static void main(String[] args) {
		try {
			/**
			 * 在RMI服务注册表中查找名称为RHello的对象,并调用其上的方法 
			 */
			HelloRmi hr = (HelloRmi)Naming.lookup("rmi://localhost:9999/hello");
			//调用服务方法
			System.out.println("Client: Hi "+hr.sayHi("Client"));
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (NotBoundException e) {
			e.printStackTrace();
		}
	}
}



执行结果如下:
运行Server
Server输出:
Rmi Server bind success

运行Client
Client输出:
Client: Hi Server

Server输出:
Server: Hi Client 172.30.39.227





分享到:
评论

相关推荐

    java rmi java rmi

    java rmi java rmijava rmi javajava rmi java rmi rmi

    java RMI技术实现的网络聊天室

    java RMI技术实现的网络聊天室 编译通过,很完整的。代码很有参考价值

    基于JAVA RMI的聊天室

    采用JAVA rmi,带图形界面,完全由自己实现的聊天室,具备基本的聊天功能,可以自己扩充功能

    javaRMI反序列化漏洞验证工具

    检测javaRMI反序列化漏洞

    java RMI简单Demo

    java RMI

    java RMI实现代码

    java RMI实现代码。分为客户端和服务器端,有清楚的代码注释。

    Java RMI 简单示例

    Java RMI 简单示例

    java rmi远程调用

    最近在学习代理模式,用到了java rmi远程调用,包含服务端和客户端,之前一直没有接触过,学习了java rmi远程调用,一方面可以了解代理模式,一方面熟悉java低层的远程

    JavaRMI.pdf

    JavaRMI.pdf

    Java RMI.pdf

    《Java RMI》一书的英文版本,With Java RMI, you'll learn tips and tricks for making your RMI code excel. This book provides strategies for working with serialization, threading, the RMI registry, ...

    javaRMI完整版.pdf

    javaRMI完整版.pdf

    Java RMI中文规范

    这是本人搜集整理的Java RMI规范,中文版,经过排版 共包括10个章节,2个附录

    java rmi上传文件

    在这次的项目中,对于客户端与服务器之间的通信,想了许多办法,由于做的是富客户端应用,最终将技术选定在了RMI和Java-sockets两种之间,其中RMI的灵活性不高,客户端和服务器端都必须是java编写,但使用比较方便,...

    原创的JavaRMI项目

    这是原创的最简单的Java RMI入门项目,内含二个Eclipse项目,一是服务器端,二是客户端。非常简单,只看其中的注释就能理解(当然先要知道什么是RMI了),只供入门用。 这是用Java 1.7编辑的,如果你用的版本低,则...

    JavaRMI的原理和实现方法

    JavaRMI的原理和实现方法 分布式对象计算 来源于青岛大学学报

    分布式程序java 实验名称 基于Java RMI的C/S编程实验

    实验名称 基于Socket的C/S编程实验 实验名称 基于Java RMI的C/S编程实验

    java rmi HelloWorld版(源码)

    java rmi 调用实例及详细说明,详细可参见博客:http://blog.csdn.net/fufengrui/article/details/9855865

    JAVARMI实例[文].pdf

    JAVARMI实例[文].pdf

    JavaRMI分布式编程心得

    网络上绝大多数关于Java RMI分布式编程的资料真的很久、很古老了, 我也是偶尔看到别人的文章,自己动手做实验才总结的一些心得与例子, 希望能够帮到那些有用的人!

Global site tag (gtag.js) - Google Analytics