java远程调用RMI

1.RMI

RMI是个典型的为java定制的远程通信协议,我们都知道,在single vm中,我们可以通过直接调用java object instance来实现通信,那么在远程通信时,如果也能按照这种方式当然是最好了,这种远程通信的机制成为RPC(Remote Procedure Call),RMI正是朝着这个目标而诞生的。

来看下基于RMI的一次完整的远程通信过程的原理:

  • 1. 客户端发起请求,请求转交至RMI客户端的stub类;
  • 2. stub类将请求的接口、方法、参数等信息进行序列化;
  • 3. 基于socket将序列化后的流传输至服务器端;
  • 4. 服务器端接收到流后转发至相应的skelton类;
  • 5. skelton类将请求的信息反序列化后调用实际的处理类;
  • 6. 处理类处理完毕后将结果返回给skelton类;
  • 7. Skelton类将结果序列化,通过socket将流传送给客户端的stub;
  • 8. stub在接收到流后反序列化,将反序列化后的Java Object返回给调用者。

2.简单例子

PersonService.java

package rmi.service;

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

//此为远程对象调用的接口,必须继承Remote类
public interface PersonService extends Remote {
	public String getPersonName(int id) throws RemoteException;
}

PersonServiceImpl.java

package rmi.serviceImpl;

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

public class PersonServiceImpl extends UnicastRemoteObject implements PersonService {
	public PersonServiceImpl() throws RemoteException {
		super();
	}

	@Override
	public String getPersonName(int id) throws RemoteException {
		String returnName;
		if (0 == id) {
			returnName = "张三";
		} else if (1 == id) {
			returnName = "李四";
		} else if (2 == id) {
			returnName = "王五";
		} else {
			returnName = "不存在";
		}
		System.out.println("------------getPersonName(" + id + ")------------");
		return returnName;
	}

}

ReremoServer.java

package rmi.remote;

import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;

import rmi.service.PersonService;
import rmi.serviceImpl.PersonServiceImpl;

public class ReremoServer {
	public static void main(String[] args) {
		try {
			PersonService personService = new PersonServiceImpl();
			// 注册通讯端口
			LocateRegistry.createRegistry(6600);
			// 注册通讯路径
			Naming.rebind("rmi://localhost:6600/PersonService", personService);
			System.out.println("------服务启动成功------");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

ReremoClient.java

package rmi.remote;

import java.rmi.Naming;

import rmi.service.PersonService;

public class ReremoClient {
	public static void main(String[] args) {
		try {
			// 调用远程对象,注意RMI路径与接口必须与服务器配置一致
			PersonService personService = (PersonService) Naming.lookup("rmi://localhost:6600/PersonService");
			for (int i = 0; i < 5; i++) {
				String name = personService.getPersonName(i);
				System.out.println("name:" + name);
			}

		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
}

3.运行结果

4.如何生成stub文件

时间: 2024-08-23 03:52:01

java远程调用RMI的相关文章

java远程调用(rmi)常见的两个错误

java的 rmi远程调用给分布式编程带来极大的方便,在使用rmi过程中若遇到以下两个问题,可以尝试如下的解决方法 错误 1 : java.rmi.server.ExportException : remote object implements illegal remote interface; nested exception is : java.lang.IllegalArgumentException : illegal remote method encountered : , 解决方

java远程调用rmi入门实例

RMI是Java的一组拥护开发分布式应用程序的API.RMI使用Java语言接口定义了远程对象,它集合了Java序列化和Java远程方法协议(Java Remote Method Protocol).简单地说,这样使原先的程序在同一操作系统的方法调用.变成了不同操作系统之间程序的方法调用.因为J2EE是分布式程序平台.它以RMI机制实现程序组件在不同操作系统之间的通信. 比方,一个EJB能够通过RMI调用Web上还有一台机器上的EJB远程方法. 用例server端结构大概如此 首先定义要传送的实

分布式服务架构之java远程调用技术浅析

分布式服务架构之java远程调用技术浅析     在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI.MINA.ESB.Burlap.Hessian.SOAP.EJB和JMS等,这些名词之间到底是些什么关系呢,它们背后到底是基于什么原理实现的呢,了解这些是实现分布式服务框架的基础知识,而如果在性能上有高的要求的话,那深入了解这些技术背后的机制就是必须的了,在这篇blog中我们将来一探究竟,抛砖引玉,欢迎大家提供更多的实现远程通讯

Java 远程调用之Hessian简例

1. [代码]1.服务接口(Hello.java) package server; public interface Hello { String hello(String name);}2. [代码]2.接口实现(HelloImpl.java) package server; public class HelloImpl implements Hello{ public String hello(String name) {    return "hello,"+name+"

Java[2] 分布式服务架构之java远程调用技术浅析(转http://www.uml.org.cn/zjjs/201208011.asp)

转自:http://www.uml.org.cn/zjjs/201208011.asp 在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI.MINA.ESB.Burlap.Hessian.SOAP.EJB和JMS等,这些名词之间到底是些什么关系呢,它们背后到底是基于什么原理实现的呢,了解这些是实现分布式服务框架的基础知识,而如果在性能上有高的要求的话,那深入了解这些技术背后的机制就是必须的了,在这篇blog中我们将来一探究竟,抛

Java远程调用

一.  概念: RMI全称是Remote Method Invocation-远程方法调用,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网络分布式应用系统的核心解决方案之一.它支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象的无缝远程调用. 二.原理: 方法调用从客户端对象经占位程序(Stub),远程引用层,和传输层向下传递给主机,然后再次经传输层,向上穿过远程调用层和骨干层,到达服务器对象. 占位程序扮演者远程服务器对象的代理角色,使该对象可被客户激活.远程

java 远程调用 shell

import java.io.BufferedReader; import java.io.ByteArrayInputStream;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.nio.charset.Charset;import java

java 远程调用 RPC

1. 概念 RPC,全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议.它允许像调用本地服务一样调用远程服务.它可以有不同的实现方式.如RMI(远程方法调用).Hessian.Http invoker等.RPC是与语言无关的.直观说法就是A通过网络调用B的过程方法.也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据. 1.首先要解决寻址的

Java 常用远程调用协议比较

一.综述本文比较了RMI,Hessian,Burlap,Httpinvoker,web service等5种通讯协议的在不同的数据结构和不同数据量时的传输性能.RMI是java语言本身提供的远程通讯协议,稳定高效,是EJB的基础.但它只能用于JAVA程序之间的通讯.Hessian和Burlap是caucho公司提供的开源协议,基于HTTP传输,服务端不用开防火墙端口.协议的规范公开,可以用于任意语言.Httpinvoker是SpringFramework提供的远程通讯协议,只能用于JAVA程序间