`

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接口。

          
          


       
分享到:
评论

相关推荐

    中间件技术研究之二

    在J2EE中,Sun给出了完整的基于Java语言开发面向企业分布应用的规范,其中在分布式互操作协议上,J2EE同时支持远程方法调用(RMI,Re—mote Method lnvocation)和因特网对象请求代理间协议(IlOP,Intemet Inter-ORB ...

    中间件技术研究(2)

    在J2EE中,Sun给出了完整的基于Java语言开发面向企业分布应用的规范,其中在分布式互操作协议上,J2EE同时支持远程方法调用(RMI,Re—mote Method lnvocation)和因特网对象请求代理间协议(IlOP,Intemet Inter-ORB ...

    Java网络编程(第三版)中文版.part11.rar

    用Telnet研究协议 284 Socket类 286 Socket异常 312 Socket地址 313 示例 314 第十章 服务器socket 332 ServerSocket类 332 一些有用的服务器 349 第十一章 安全Socket 370 保护通信 371 创建安全客户端...

    jsr80 java 访问 usb

    它包括一个 RMI proxy 和一个 daemon 应用程序,它让 Java 应用程序可以访问远程计算机上的 USB 设备。 usb.util : 这个包提供了一些有用的实用程序,可以将 firmware下载到 USB 设备上、将 USB 系统的内容转储到 ...

    Java网络编程(第三版)高清中文版.part01.rar

    用Telnet研究协议 284 Socket类 286 Socket异常 312 Socket地址 313 示例 314 第十章 服务器socket 332 ServerSocket类 332 一些有用的服务器 349 第十一章 安全Socket 370 保护通信 371 创建安全客户端...

    Java网络编程(第三版)中文版.part06.rar

    用Telnet研究协议 284 Socket类 286 Socket异常 312 Socket地址 313 示例 314 第十章 服务器socket 332 ServerSocket类 332 一些有用的服务器 349 第十一章 安全Socket 370 保护通信 371 创建安全客户端...

    Java网络编程(第三版)中文版.part07.rar

    用Telnet研究协议 284 Socket类 286 Socket异常 312 Socket地址 313 示例 314 第十章 服务器socket 332 ServerSocket类 332 一些有用的服务器 349 第十一章 安全Socket 370 保护通信 371 创建安全客户端...

    Java网络编程(第三版)中文版.part09.rar

    用Telnet研究协议 284 Socket类 286 Socket异常 312 Socket地址 313 示例 314 第十章 服务器socket 332 ServerSocket类 332 一些有用的服务器 349 第十一章 安全Socket 370 保护通信 371 创建安全客户端...

    Java网络编程(第三版)中文版.part01.rar

    用Telnet研究协议 284 Socket类 286 Socket异常 312 Socket地址 313 示例 314 第十章 服务器socket 332 ServerSocket类 332 一些有用的服务器 349 第十一章 安全Socket 370 保护通信 371 创建安全客户端...

    Java网络编程(第三版)中文版.part03.rar

    用Telnet研究协议 284 Socket类 286 Socket异常 312 Socket地址 313 示例 314 第十章 服务器socket 332 ServerSocket类 332 一些有用的服务器 349 第十一章 安全Socket 370 保护通信 371 创建安全客户端...

    Java网络编程(第三版)中文版.part02.rar

    用Telnet研究协议 284 Socket类 286 Socket异常 312 Socket地址 313 示例 314 第十章 服务器socket 332 ServerSocket类 332 一些有用的服务器 349 第十一章 安全Socket 370 保护通信 371 创建安全客户端...

    Java网络编程(第三版)中文版.part04.rar

    用Telnet研究协议 284 Socket类 286 Socket异常 312 Socket地址 313 示例 314 第十章 服务器socket 332 ServerSocket类 332 一些有用的服务器 349 第十一章 安全Socket 370 保护通信 371 创建安全客户端...

    Java网络编程(第三版)中文版.part10.rar

    用Telnet研究协议 284 Socket类 286 Socket异常 312 Socket地址 313 示例 314 第十章 服务器socket 332 ServerSocket类 332 一些有用的服务器 349 第十一章 安全Socket 370 保护通信 371 创建安全客户端...

    Java网络编程(第三版)中文版.part13.rar

    用Telnet研究协议 284 Socket类 286 Socket异常 312 Socket地址 313 示例 314 第十章 服务器socket 332 ServerSocket类 332 一些有用的服务器 349 第十一章 安全Socket 370 保护通信 371 创建安全客户端...

    Java网络编程(第三版)中文版.part05.rar

    用Telnet研究协议 284 Socket类 286 Socket异常 312 Socket地址 313 示例 314 第十章 服务器socket 332 ServerSocket类 332 一些有用的服务器 349 第十一章 安全Socket 370 保护通信 371 创建安全客户端...

    Java网络编程(第三版)中文版.part12.rar

    用Telnet研究协议 284 Socket类 286 Socket异常 312 Socket地址 313 示例 314 第十章 服务器socket 332 ServerSocket类 332 一些有用的服务器 349 第十一章 安全Socket 370 保护通信 371 创建安全客户端...

    Java网络编程(第三版)中文版.part08.rar

    用Telnet研究协议 284 Socket类 286 Socket异常 312 Socket地址 313 示例 314 第十章 服务器socket 332 ServerSocket类 332 一些有用的服务器 349 第十一章 安全Socket 370 保护通信 371 创建安全客户端...

    科来网络分析系统 7.7.2.4032 正式版

    新增SIP,SDP,MEGACO/H.248,MGCP,931,SAP,H.225,RMI,Oracle,MMS,GOOSE,SMV,GMRP协议的识别和解码。 在线激活页面:添加了获取序列号的链接,用户可以自己手动获取技术交流版的激活序列号。

Global site tag (gtag.js) - Google Analytics