`

RMI远程调用

 
阅读更多
第一步:远程对象接口
WareHose.java
package server;
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface WareHose extends Remote{
	
	public Double getPrice(String description)throws RemoteException;
	
}

第二步:实现远程对象接口
package server;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.HashMap;
import java.util.Map;

public class WareHoseImpl extends UnicastRemoteObject implements WareHose{
	private static final long serialVersionUID = -5446129893581781406L;
	
	private Map<String,Double> map = null;
	
	public WareHoseImpl() throws RemoteException {
		super();
		map = new HashMap<String,Double>();
		map.put("Apple", 6.5);
		map.put("orange", 8.9);
		//如果WareHoseImpl已经继承了其他的类可用在构造函数中使用
		//UnicastRemoteObject.exportObject(this, 0);第二个参数0表示可在服务器任意端口上监听远程调用请求
	}
	
	@Override
	public Double getPrice(String description) throws RemoteException {
		return map.get(description);
	}
}

第三步:将远程对象注册到RMI注册表中
package server;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class RegisterRmiServer {
	private final static void register(String name,Object obj) throws NamingException{
		Context namingContext = new InitialContext();
		if(name != null)
			//绑定的url格式为rmi://主机名:端口号/RMI注册对象的名称  次名称用于唯一表示远程对象客户端可通过此名称找到远程对象
			//不写主机和端口号的话默认为localhost:1099
			namingContext.bind("rmi:RemoteObject_"+name, obj);
		else
			namingContext.bind("rmi:"+obj.getClass().getSimpleName(), obj);
	}
	public final static void start(List<Object> list){
		for(Object obj : list){
			try {
				register(null, obj);
			} catch (NamingException e) {
				e.printStackTrace();
			}
		}
	}
	public final static void start(Map<String,Object> map){
		for(Entry<String, Object> entry : map.entrySet()){
			try {
				register(entry.getKey(), entry.getValue());
			} catch (NamingException e) {
				e.printStackTrace();
			}
		}
	}
	public static void main(String[] args) throws Exception{
		List<Object> list = new ArrayList<Object>();
		WareHoseImpl wHose = new WareHoseImpl();
		list.add(wHose);
		RegisterRmiServer.start(list);
	}
}

第四步:创建客户端访问远程对象
package client;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NameClassPair;
import javax.naming.NamingEnumeration;

import server.WareHose;

public class AccessRemoteObject {
	public static void main(String[] args) throws Exception{
		Context namingContext = new InitialContext();
		NamingEnumeration<NameClassPair> e = namingContext.list("rmi://localhost/");
		while(e.hasMore()){
			System.out.println(e.nextElement().getName());
		}
		WareHose wareHose = (WareHose)namingContext.lookup("rmi:WareHoseImpl");
		System.out.println(wareHose.getPrice("orange"));
	}
}

第五步:启动RMI注册表(Window下)
在java安装路径下bin目录下有一个rmiregistry.exe服务
由于类:RegisterRmiServer.java在注册远程对象到RMI注册表中的时候rmiregistry需要加载远程对象的.class字节码文件,这里涉及到一个classpath的问题

cmd>set classpath=%classpath%;远程对象的.class文件顶级包所在的目录
cmd>rmiregistry


上述命令要在同一个cmd窗口下执行

接下来可以用main方法测试效果
分享到:
评论

相关推荐

    RMI远程调用代码及使用方法

    ### RMI远程调用代码及使用方法 #### 一、RMI简介 远程方法调用(Remote Method Invocation,简称RMI)是Java平台提供的一种分布式计算技术,它允许开发人员在不同的Java虚拟机(JVM)之间进行对象的远程调用。通过...

    rmi远程调用读取文件

    在这个场景中,“rmi远程调用读取文件”指的是通过RMI机制,使得一个JVM中的程序能够请求另一个JVM上的程序读取并返回文件内容。这种方式在分布式系统中非常常见,可以用于数据共享、文件服务等应用。 RMI的基本...

    动态代理与RMI远程调用

    在提供的`动态代理与RMI远程调用.ppt`中,可能会详细解释这两个概念,通过PPT的讲解和实例,可以更直观地理解动态代理和RMI的工作原理。同时,`src`目录下的源码文件则提供了具体的实现示例,读者可以通过阅读代码,...

    rmi 远程调用 实现客户端之间会话

    标题中的“rmi 远程调用 实现客户端之间会话”指的是利用RMI技术让多个客户端与同一服务端建立会话,进行交互。这通常涉及到以下几个核心概念: 1. **远程接口**:这是定义了可以远程调用的方法的接口。远程接口...

    java rmi远程调用

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

    Java RMI 远程调用实例.rar

    Java RMI 远程调用实例,各个文件的作用:  DISPLAYPERFECTTIME.JAVA|:向rmiregistry查找PerfectTime对象,定义调用远程对象的方法。  PERFECTTIME.JAVA:向RMI注册服务,以便客户端查找,创建提供注册服务的本地...

    java 实现RMI远程调用

    实现java RMI 远程调用,包括 RMIServer RMIClient源码,测试用例。

    JAVA RMI远程调用方法代码

    接下来,`getMemberAccountCount`方法实现了远程调用逻辑,通过`this.ref.invoke`方法调用了远程方法,并处理了可能抛出的异常。 #### 2. 客户端代码分析 客户端通过`Naming.lookup`方法获取远程服务的引用,然后...

    分布式 RMI远程调用

    分布式RMI(Remote Method Invocation)远程调用是一种在分布式系统中实现对象间通信的技术,它允许一个对象在某个进程中调用另一个位于不同进程或者不同计算机上的对象的方法,从而实现跨网络的对象交互。...

    三种方式实现java远程调用(rmi),绝对可用

    Java远程调用(Remote Method Invocation,RMI)是Java平台中一种重要的分布式计算技术,它允许在不同网络环境中的Java对象之间进行透明的交互。在本文中,我们将深入探讨三种不同的RMI实现方法:原始方式、Spring...

    使用rmi进行远程调用

    在这个“使用rmi进行远程调用”的示例中,我们看到的是一个基于RMI实现的银行系统。这个小例子旨在帮助开发者理解如何使用RMI来构建分布式应用程序,尤其是在处理跨网络的远程对象交互时。 首先,RMI的核心概念是...

    spring RMI 远程接口调用

    Spring RMI(Remote Method Invocation)远程接口调用是Spring框架提供的一个特性,它允许你在分布式环境中调用对象的方法,使得应用程序能够跨越网络边界操作远程对象。这个技术在大型企业级应用中尤其有用,因为它...

    RMI实现的远程调用

    4. ** stubs 和 skeletons**:在RMI中,远程对象的引用在客户端是通过stubs(桩)表示的,而实际的远程调用则由serverside的skeleton(骨架)处理。现代的JVM已经不再需要手动生成stubs和skeletons,它们由Java...

    RMI远程调用视频教材

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

    Java RMI(远程方法调用)Demo

    1. **创建远程接口**:定义一个继承自Remote的接口,声明需要远程调用的方法。 2. **实现远程接口**:编写一个类实现这个接口,提供具体的方法实现。 3. **注册远程对象**:在服务器端创建远程对象实例,然后将其...

    RMI 远程调用

    **RMI(Remote Method Invocation)远程方法调用**是Java平台提供的一种分布式计算技术,它允许Java...不过,需要注意的是,虽然RMI简化了远程调用,但在高并发和大规模网络环境下的性能和可靠性还需要仔细评估和优化。

    RMI远程调用DEMO....

    6. 远程方法调用过程:当客户端调用远程对象的方法时,RMI系统会负责序列化参数,通过网络发送到服务器端。服务器端接收到请求后,反序列化参数,执行相应的远程方法,并将结果序列化回传给客户端。 7. 异常处理:...

    RMI远程方法调用RMI远程方法调用

    RMI远程方法调用是Java平台上的一个关键特性,它允许Java对象在不同的JVM之间进行通信,从而实现分布式计算。RMI的核心理念是让开发者能够像调用本地方法一样调用远程对象的方法,简化了分布式系统的设计和实现。 *...

    RMI远程过程调用

    RMI采用JRMP(Java Remote Method Protocol)通讯协议,是构建在TCP/IP协议上的一种远程调用方法。它允许运行在一个Java虚拟机上的对象调用运行在另一个Java虚拟机上的对象方法,从而使编程人员可以方便地在网络环境...

Global site tag (gtag.js) - Google Analytics