`

RMI协议的应用与研究

阅读更多
        最近公司需要将一个服务层框架进行升级,原来的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接口。

          
          


       
分享到:
评论

相关推荐

    Java RMI分布式系统应用研究.pdf

    文章中提到的分布式系统应用研究,涉及了RMI的运行机制和开发分布式系统的步骤,最后给出了RMI技术的具体应用实例和实现方法。RMI不仅提供了远程方法调用的功能,还涉及到网络连接、对象序列化与反序列化、远程对象...

    RMI协议解析

    《RMI协议解析》 远程方法调用(Remote Method Invocation,简称RMI)是Java平台上的一个重要特性,它允许在不同的Java虚拟机之间进行对象的方法调用,仿佛这些对象都在同一进程中。RMI使得分布式计算变得简单,...

    基于Java的RMI技术的研究与应用.pdf

    基于Java的RMI技术的研究与应用 Java语言由于其突出的简单性、可移植性、安全性和支持并发机制的程序设计等优良特性,使其成为基于Internet网络应用开发的首选语言。其价值主要体现在强大的开发分布式网络应用的...

    基于CORBA_JAVA RMI的分布式系统应用研究.pdf

    基于CORBA和JAVA RMI的分布式系统应用研究 CORBA(Common Object Request Broker Architecture)是一种公共对象请求代理体系结构,主要分为三个部分:接口定义语言(IDL)、对象请求代理(ORB)和ORB之间的互操作...

    synaptics s3202 寄存器手册以及RMI4手册

    RMI4,是Synaptics为触控设备设计的一种通信协议,它允许主机系统与触控控制器之间高效地交换数据和控制信息。《511-000136-01-Rev-E-RMI4-Interfacing-Guide.pdf》这份文档深入解析了RMI4协议的各个方面,包括帧...

    web服务器 RMI meeting

    RMI在分布式Web应用程序中特别有用,因为它可以实现服务器端组件的远程调用,例如,一个Web应用可能需要调用后台数据库服务或其他服务器服务,这时RMI就发挥了作用。 Socket编程是网络编程的基础,它提供了一个低...

    RMI-IIOP 基于SUN

    RMI-IIOP则是在RMI的基础上添加了对CORBA IIOP协议的支持,使得Java对象可以透明地与非Java的CORBA对象进行交互。IIOP是一种基于TCP/IP的协议,用于在不同的ORB(Object Request Broker)之间交换对象请求。 RMI-...

    rmi_java项目实例

    通过深入研究这个"rmi_java项目实例",不仅可以掌握RMI的基本用法,还能了解到如何在实际项目中应用分布式计算技术,提升你的Java开发能力。同时,此项目也提供了一个交流和学习的平台,你可以联系项目作者讨论和...

    基于JavaRMI的分布对象负载均衡研究与实现.pdf

    【基于JavaRMI的分布对象负载均衡研究与实现】 随着互联网技术的发展,分布对象技术已成为构建大型分布式应用系统的关键技术,其中Java Remote Method Invocation(Java RMI)是Java平台上的重要实现方式。Java RMI...

    zookeeper+rmi开发

    结合"Zookeeper+rmi开发"的标题和描述,我们可以理解这是一个关于如何使用ZooKeeper进行服务注册与发现,并通过RMI实现远程调用的示例代码。在这样的场景下,ZooKeeper可能被用作服务注册中心,各服务节点通过...

    rmi_iiop.zip_rmi

    通过深入研究这个RMI-IIOP的实例,我们可以更好地理解如何在Java中实现分布式的、跨平台的应用,并掌握RMI和IIOP在实际项目中的应用技巧。此外,了解如何在不同环境和网络条件下调试和优化RMI-IIOP应用也是至关重要...

    Java RMI-IIOP 相关源代码.rar

    当Java RMI与IIOP结合时,RMI可以利用IIOP实现跨语言、跨平台的互操作性,使得Java应用可以与非Java的CORBA系统进行通信。 在这个压缩包中,可能包含的源文件可能有以下几个部分: 1. **远程接口**:定义了可以在...

    J2SE.RMI.IIOP.application.design.code.rar_code rmi_rmi iiop

    RMI-IIOP是RMI的一种扩展,它使用IIOP作为其底层传输协议,从而允许Java对象与实现CORBA接口的对象进行交互。IIOP是一种网络协议,它定义了对象如何通过ORB(Object Request Broker)进行交互,ORB是负责解码和编码...

    rmi-远程调用方法

    RMI(Remote Method Invocation,远程方法调用)是Java平台中的一个重要特性,它允许Java对象在不同的Java虚拟机(JVM)之间进行通信,从而...建议解压后仔细研究,结合理论知识与实践代码,能更好地掌握RMI的使用。

    JAVA网络通信系统的研究与开发,java远程通信及应用的研究,Java源码.zip

    本文将深入探讨“JAVA网络通信系统的研究与开发”和“java远程通信及应用的研究”,并结合提供的Java源码进行分析。 首先,我们要理解Java网络通信的基础。Java提供了丰富的API来支持网络编程,如Socket编程、...

    Java RMI-IIOP相关源代码

    RMI使得Java对象能够调用远程对象的方法,而IIOP则是CORBA中的通信协议,它允许不同操作系统和网络环境下的对象进行互操作。这个源代码包显然为Java EJB(Enterprise JavaBeans)初学者提供了学习资源,特别是关于...

    RMI-IIOP_java_

    RMI-IIOP是RMI与IIOP的结合,让Java应用能够利用CORBA的互操作性特性,与非Java的CORBA实现进行通信。 在提供的源码实例中,可能包含以下关键组成部分: 1. **远程接口**(Remote Interface):定义了远程服务的...

    JMS 与RMI 技术在数据库监测系统中应用研究* (2005年)

    在探讨JMS与RMI技术在数据库监测系统中的应用研究时,首先要了解JMS与RMI的概念和工作原理。JMS(Java消息服务)是一种基于Java的消息服务规范,它提供了创建、发送、接收消息的标准API函数,允许在分布式应用对象间...

Global site tag (gtag.js) - Google Analytics