最近公司需要将一个服务层框架进行升级,原来的RPC协议是用的RMI,由于RMI可能在不同版本的JVM之间传递会产生问题,因此需要找出一种RPC协议来替换掉EJB的RMI,要求有三个:一、在不同版本的JVM之间互调不会出现问题;二、支持引用参数传递;三、效率说得过去。于是就研究了几种RPC协议:RMI,hessian,spring集成的hessian以及基于kryo序列化机制的kryonet。首先研究RMI:
1. 对象User、Person、TestModel1、TestModel2、ComplexModel
User.java
public class User implements java.io.Serializable{
private String id;
private String userName;
private String password;
private int age;
private List<String> friends;
public String getid() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public List<String> getFriends() {
return friends;
}
public void setFriends(List<String> friends) {
this.friends = friends;
}
}
Person.java
public class Person implements java.io.Serializable{
}
TestModel1.java
public class TestModel1 implements java.io.Serializable{
private User user;
private String keys;
private Map<String,String> params;
public String getKeys() {
return keys;
}
public void setKeys(String keys) {
this.keys = keys;
}
public Map<String, String> getParams() {
return params;
}
public void setParams(Map<String, String> params) {
this.params = params;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
TestModel2.java
public class TestModel2 implements java.io.Serializable{
private User user;
private int quantity;
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
ComplexModel.java
public class User implements java.io.Serializable{
private String id;
private String userName;
private String password;
private int age;
private List<String> friends;
public String getid() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public List<String> getFriends() {
return friends;
}
public void setFriends(List<String> friends) {
this.friends = friends;
}
}
2.接口 PeopleService 实现PeopleServiceImpl
PeopleService.java
public interface PeopleService extends Remote{
public String showMessage(String name) throws RemoteException;
public User getUser() throws RemoteException;
public ComplexModel getModel() throws RemoteException;
public void compareModel(ComplexModel model) throws RemoteException;
}
PeopleServiceImpl.java
public class PeopleServiceImpl extends UnicastRemoteObject implements PeopleService{
public PeopleServiceImpl() throws RemoteException {
super();
// TODO Auto-generated constructor stub
}
public User getUser() throws RemoteException{
User result = new User();
result.setId("007");
result.setUserName("zhangsan");
result.setPassword("123456");
List<String> fs = new ArrayList<String>();
fs.add("sdsfdsfsd");
fs.add("sfsdfdsgsdf");
result.setFriends(fs);
return result;
}
public ComplexModel getModel() throws RemoteException{
ComplexModel model = new ComplexModel();
User user = new User();
user.setId("007");
user.setUserName("zhangsan");
user.setPassword("123456");
List<String> fs = new ArrayList<String>();
fs.add("sdsfdsfsd");
fs.add("sfsdfdsgsdf");
user.setFriends(fs);
TestModel1 m1 = new TestModel1();
m1.setUser(user);
TestModel2 m2 = new TestModel2();
m2.setUser(user);
model.setModel1(m1);
model.setModel2(m2);
System.out.println("....." + (model.getModel1().getUser() == model.getModel2().getUser()));
return model;
}
public void compareModel(ComplexModel model) throws RemoteException{
System.out.println("....." + (model.getModel1().getUser() == model.getModel2().getUser()));
}
public String showMessage(String name) throws RemoteException{
// TODO Auto-generated method stub
return null;
}
}
3 RMI绑定服务器 RMIServer
RMIServer.java
public class RMIServer {
/**
* @param args
*/
public static void main(String[] args) {
try {
LocateRegistry.createRegistry(9099);
PeopleServiceImpl rmi = new PeopleServiceImpl();
try {
Naming.bind("//127.0.0.1:9099/RMI_SERVER",rmi);
System.out.println("rmi对象已经注册到服务器上");
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (AlreadyBoundException e) {
e.printStackTrace();
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
4.RMI访问客户端 RMIClient
RMIClient.java
public class RMIClient {
/**
* @param args
*/
public static void main(String[] args) {
for (int index = 0; index < 1000; index++) {
try {
PeopleService service = (PeopleService) Naming
.lookup("//127.0.0.1:9099/RMI_SERVER");
ComplexModel cm = service.getModel();
System.out.println(cm.getModel1().getUser() == cm.getModel2()
.getUser());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
} catch (NotBoundException e) {
e.printStackTrace();
}
}
}
}
5.服务端核心代码
注册端口 LocateRegistry.createRegistry(9099);
绑定远程对象 Naming.bind("//127.0.0.1:9099/RMI_SERVER",rmi);
6.客户端核心代码
访问远程对象 PeopleService service = (PeopleService) Naming
.lookup("//127.0.0.1:9099/RMI_SERVER");
7.测试结果: RMI能够实现不同版本的JVM之间传递复杂对象,并且能够传递引用参数。传输的对象必须实现java.io.Serializable接口。
分享到:
相关推荐
文章中提到的分布式系统应用研究,涉及了RMI的运行机制和开发分布式系统的步骤,最后给出了RMI技术的具体应用实例和实现方法。RMI不仅提供了远程方法调用的功能,还涉及到网络连接、对象序列化与反序列化、远程对象...
《RMI协议解析》 远程方法调用(Remote Method Invocation,简称RMI)是Java平台上的一个重要特性,它允许在不同的Java虚拟机之间进行对象的方法调用,仿佛这些对象都在同一进程中。RMI使得分布式计算变得简单,...
基于Java的RMI技术的研究与应用 Java语言由于其突出的简单性、可移植性、安全性和支持并发机制的程序设计等优良特性,使其成为基于Internet网络应用开发的首选语言。其价值主要体现在强大的开发分布式网络应用的...
基于CORBA和JAVA RMI的分布式系统应用研究 CORBA(Common Object Request Broker Architecture)是一种公共对象请求代理体系结构,主要分为三个部分:接口定义语言(IDL)、对象请求代理(ORB)和ORB之间的互操作...
RMI4,是Synaptics为触控设备设计的一种通信协议,它允许主机系统与触控控制器之间高效地交换数据和控制信息。《511-000136-01-Rev-E-RMI4-Interfacing-Guide.pdf》这份文档深入解析了RMI4协议的各个方面,包括帧...
RMI在分布式Web应用程序中特别有用,因为它可以实现服务器端组件的远程调用,例如,一个Web应用可能需要调用后台数据库服务或其他服务器服务,这时RMI就发挥了作用。 Socket编程是网络编程的基础,它提供了一个低...
RMI-IIOP则是在RMI的基础上添加了对CORBA IIOP协议的支持,使得Java对象可以透明地与非Java的CORBA对象进行交互。IIOP是一种基于TCP/IP的协议,用于在不同的ORB(Object Request Broker)之间交换对象请求。 RMI-...
通过深入研究这个"rmi_java项目实例",不仅可以掌握RMI的基本用法,还能了解到如何在实际项目中应用分布式计算技术,提升你的Java开发能力。同时,此项目也提供了一个交流和学习的平台,你可以联系项目作者讨论和...
【基于JavaRMI的分布对象负载均衡研究与实现】 随着互联网技术的发展,分布对象技术已成为构建大型分布式应用系统的关键技术,其中Java Remote Method Invocation(Java RMI)是Java平台上的重要实现方式。Java RMI...
结合"Zookeeper+rmi开发"的标题和描述,我们可以理解这是一个关于如何使用ZooKeeper进行服务注册与发现,并通过RMI实现远程调用的示例代码。在这样的场景下,ZooKeeper可能被用作服务注册中心,各服务节点通过...
通过深入研究这个RMI-IIOP的实例,我们可以更好地理解如何在Java中实现分布式的、跨平台的应用,并掌握RMI和IIOP在实际项目中的应用技巧。此外,了解如何在不同环境和网络条件下调试和优化RMI-IIOP应用也是至关重要...
当Java RMI与IIOP结合时,RMI可以利用IIOP实现跨语言、跨平台的互操作性,使得Java应用可以与非Java的CORBA系统进行通信。 在这个压缩包中,可能包含的源文件可能有以下几个部分: 1. **远程接口**:定义了可以在...
RMI-IIOP是RMI的一种扩展,它使用IIOP作为其底层传输协议,从而允许Java对象与实现CORBA接口的对象进行交互。IIOP是一种网络协议,它定义了对象如何通过ORB(Object Request Broker)进行交互,ORB是负责解码和编码...
RMI(Remote Method Invocation,远程方法调用)是Java平台中的一个重要特性,它允许Java对象在不同的Java虚拟机(JVM)之间进行通信,从而...建议解压后仔细研究,结合理论知识与实践代码,能更好地掌握RMI的使用。
本文将深入探讨“JAVA网络通信系统的研究与开发”和“java远程通信及应用的研究”,并结合提供的Java源码进行分析。 首先,我们要理解Java网络通信的基础。Java提供了丰富的API来支持网络编程,如Socket编程、...
RMI使得Java对象能够调用远程对象的方法,而IIOP则是CORBA中的通信协议,它允许不同操作系统和网络环境下的对象进行互操作。这个源代码包显然为Java EJB(Enterprise JavaBeans)初学者提供了学习资源,特别是关于...
RMI-IIOP是RMI与IIOP的结合,让Java应用能够利用CORBA的互操作性特性,与非Java的CORBA实现进行通信。 在提供的源码实例中,可能包含以下关键组成部分: 1. **远程接口**(Remote Interface):定义了远程服务的...
在探讨JMS与RMI技术在数据库监测系统中的应用研究时,首先要了解JMS与RMI的概念和工作原理。JMS(Java消息服务)是一种基于Java的消息服务规范,它提供了创建、发送、接收消息的标准API函数,允许在分布式应用对象间...