Java Rmi的练习

最近做了个Java Rmi的小例子,把代码贴出来,和大家交流交流。也是网上搜罗。一些达人朋友的技术成果。呵呵!!!

Java Rmi指的是远程方法调用 (Remote Method Invocation)。做Java分布式开发用的!!!

什么是分布式开发,举个小例子哇:小Z是四川人,户籍肯定是在四川的户籍数据库里,前阵子在山西报名学驾校,山西这边的系统要查询小Z的户籍信息,应该就是通过远程调用四川系统的接口,返回小Z的信息。四川、山西两套独立管理户籍的系统,通过计算机网络连在一起,看似一个整体一样。这就是分布式系统的妙用。(这也许是胡编,把大概的意思说明白就行了,也许政府的系统更高级呢?呵呵)

上个小例子吧:Server端和Client端两个独立的工程:(发现JDK1.5+,搭建RMI程序很是方便,很多方法大家可以查看JDK的API帮助文档)

Server端:需要开通接口方法,以便Client端调用。

RMI接口方法调用,首先就是定义一个接口吧:

/**
 * JAVA RMI Server端,开放给客户端的方法
 */
package com.zyujie.rmi;

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.List;
import java.util.Map;

import com.zyujie.pojo.UserInfo;

public interface UserInfoInterface extends Remote{

	/*
	 * 获取用户名称
	 */
	public String getUserName() throws RemoteException;
	
	/*
	 * 获取用户密码
	 */
	public String getUserPassword() throws RemoteException;
	
	/*
	 * 获取用户基本信息,此方法返回值是一个JavaBean
	 */
	public UserInfo getUserInfo() throws RemoteException;
	
	/*
	 * 获取用户基本信息,此方法返回值是一个map
	 */
	public Map<String,String> getUserInfoMap() throws RemoteException;
	
	/*
	 * 获取用户基本信息,此方法返回值是一个List套javabean
	 */
	public List<UserInfo> getUserInfoListBean() throws RemoteException;
	
	/*
	 * 获取用户基本信息,此方法返回值是一个List套map的方式
	 */
	public List<Map<String,String>> getCityInfoListMap() throws RemoteException;
}

有了接口,Server端,得有一个接口的实现类,好做一些DAO数据查询啊,什么的。

/**
 * RMI开放接口的实现类
 */
package com.zyujie.rmi;

import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.zyujie.pojo.UserInfo;

public class UserInfoImpl implements UserInfoInterface {

	public UserInfo getUserInfo() throws RemoteException {
		UserInfo userInfo = new UserInfo();
		userInfo.setUser_id("admin");
		userInfo.setUser_name("系统管理员");
		userInfo.setUser_password("888888");
		userInfo.setUser_email("admin@zyujie.com");
		userInfo.setUser_dept("信息化建议中心");
		return userInfo;
	}

	public String getUserName() throws RemoteException {
		return "系统管理员";
	}

	public String getUserPassword() throws RemoteException {
		return "888888";
	}

	/*
	 * 获取用户基本信息,此方法返回值是一个map
	 */
	public Map<String,String> getUserInfoMap() throws RemoteException{
		Map<String,String> map = new HashMap<String, String>();
		map.put("UserId", "admin");
		map.put("UserPassword", "888888");
		return map;
	}
	
	/*
	 * 获取用户基本信息,此方法返回值是一个List套javabean
	 */
	public List<UserInfo> getUserInfoListBean() throws RemoteException{
		List<UserInfo> list = new ArrayList<UserInfo>();
		UserInfo userOne = new UserInfo();
		userOne.setUser_id("userOne");
		userOne.setUser_name("用户111");
		userOne.setUser_password("111111");
		userOne.setUser_email("userOne@zyujie.com");
		userOne.setUser_dept("行政部");
		list.add(userOne);
		
		UserInfo userTwo = new UserInfo();
		userTwo.setUser_id("userTwo");
		userTwo.setUser_name("用户222");
		userTwo.setUser_password("222222");
		userTwo.setUser_email("userTwo@zyujie.com");
		userTwo.setUser_dept("人力资源部");
		list.add(userTwo);
		
		UserInfo userThree = new UserInfo();
		userThree.setUser_id("userThree");
		userThree.setUser_name("用户333");
		userThree.setUser_password("333333");
		userThree.setUser_email("userThree@zyujie.com");
		userThree.setUser_dept("销售部");
		list.add(userThree);
		return list;
	}
	
	/*
	 * 获取用户基本信息,此方法返回值是一个List套map的方式
	 */
	public List<Map<String,String>> getCityInfoListMap() throws RemoteException{
		List<Map<String,String>> list = new ArrayList<Map<String,String>>();
		Map<String,String> mapSY = new HashMap<String, String>();
		mapSY.put("cityName", "沈阳");
		mapSY.put("cityArea", "东北");
		list.add(mapSY);
		Map<String,String> mapBJ = new HashMap<String, String>();
		mapBJ.put("cityName", "北京");
		mapBJ.put("cityArea", "华北");
		list.add(mapBJ);
		Map<String,String> mapSH = new HashMap<String, String>();
		mapSH.put("cityName", "上海");
		mapSH.put("cityArea", "华东");
		list.add(mapSH);
		Map<String,String> mapGZ = new HashMap<String, String>();
		mapGZ.put("cityName", "广州");
		mapGZ.put("cityArea", "华南");
		list.add(mapGZ);
		Map<String,String> mapXA = new HashMap<String, String>();
		mapXA.put("cityName", "西安");
		mapXA.put("cityArea", "西北");
		list.add(mapXA);
		Map<String,String> mapCD = new HashMap<String, String>();
		mapCD.put("cityName", "成都");
		mapCD.put("cityArea", "西南");
		list.add(mapCD);
		return list;
	}
}

由于涉及到JavaBean的网络传输,所以这里做了一个JavaBean,再序列化。

package com.zyujie.pojo;

/**
 * 为了在RMI中传递Java Object,我们把userinfo作为一个javabean,并序列化。
 */
import java.io.Serializable;

public class UserInfo implements Serializable{

	private static final long serialVersionUID = 1L;

	private String user_id;
	
	private String user_name;
	
	private String user_password;
	
	private String user_email;
	
	private String user_dept;

	public String getUser_id() {
		return user_id;
	}

	public void setUser_id(String user_id) {
		this.user_id = user_id;
	}

	public String getUser_name() {
		return user_name;
	}

	public void setUser_name(String user_name) {
		this.user_name = user_name;
	}

	public String getUser_password() {
		return user_password;
	}

	public void setUser_password(String user_password) {
		this.user_password = user_password;
	}

	public String getUser_email() {
		return user_email;
	}

	public void setUser_email(String user_email) {
		this.user_email = user_email;
	}

	public String getUser_dept() {
		return user_dept;
	}

	public void setUser_dept(String user_dept) {
		this.user_dept = user_dept;
	}
}

下面是在Server端注册接口方法,和开放端口了哇

/**
 * 程序的入口类,主要是注册你已经实现的RMI接口,并开放端口给客户端
 */
package com.zyujie.rmi;

import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

public class AppEntry {

	public static void main(String[] args) throws AlreadyBoundException, RemoteException {
		UserInfoImpl userInfoImpl = new UserInfoImpl();
		//使用提供的特定端口导出远程对象,以便能够接收传入的调用。 
		UserInfoInterface userInfoInterface = (UserInfoInterface)UnicastRemoteObject.exportObject(userInfoImpl,0);
		//创建并导出接受指定 port 请求的本地主机上的 Registry 实例
		Registry registry = LocateRegistry.createRegistry(8080); 
		//绑定对此注册表中指定 name 的远程引用。 
		registry.rebind("UserInfo", userInfoInterface); 
		System.out.println("服务器已经准备就绪,可随时调用。"); 
	}
}

Server端就编写完成,下面是Client端,通常Server端会把接口类,实体类,打成jar包,发给客户端。但我这里就直接在客户端再写一次接口和JavaBean

接口同服务端接口一样:

package com.zyujie.rmi;

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.List;
import java.util.Map;

import com.zyujie.pojo.UserInfo;

public interface UserInfoInterface extends Remote{

	/*
	 * 获取用户名称
	 */
	public String getUserName() throws RemoteException;
	
	/*
	 * 获取用户密码
	 */
	public String getUserPassword() throws RemoteException;
	
	/*
	 * 获取用户基本信息,此方法返回值是一个JavaBean
	 */
	public UserInfo getUserInfo() throws RemoteException;
	
	/*
	 * 获取用户基本信息,此方法返回值是一个map
	 */
	public Map<String,String> getUserInfoMap() throws RemoteException;
	
	/*
	 * 获取用户基本信息,此方法返回值是一个List套javabean
	 */
	public List<UserInfo> getUserInfoListBean() throws RemoteException;
	
	/*
	 * 获取用户基本信息,此方法返回值是一个List套map的方式
	 */
	public List<Map<String,String>> getCityInfoListMap() throws RemoteException;
}

实体类和服务端实体类一样:

package com.zyujie.pojo;

/**
 * 为了在RMI中传递Java Object,我们把userinfo作为一个javabean,并序列化。
 */
import java.io.Serializable;

public class UserInfo implements Serializable{

	private static final long serialVersionUID = 1L;

	private String user_id;
	
	private String user_name;
	
	private String user_password;
	
	private String user_email;
	
	private String user_dept;

	public String getUser_id() {
		return user_id;
	}

	public void setUser_id(String user_id) {
		this.user_id = user_id;
	}

	public String getUser_name() {
		return user_name;
	}

	public void setUser_name(String user_name) {
		this.user_name = user_name;
	}

	public String getUser_password() {
		return user_password;
	}

	public void setUser_password(String user_password) {
		this.user_password = user_password;
	}

	public String getUser_email() {
		return user_email;
	}

	public void setUser_email(String user_email) {
		this.user_email = user_email;
	}

	public String getUser_dept() {
		return user_dept;
	}

	public void setUser_dept(String user_dept) {
		this.user_dept = user_dept;
	}
}

为了不出错,包名和路径名都完全一样。当然用jar是最好的。

下面是Client调用类了。配上IP地址,端口号,和远程方法引用名。就可以了。

/**
 * 客户端调用RMI远程接口。
 */
package com.zyujie.rmi;

import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.List;
import java.util.Map;

import com.zyujie.pojo.UserInfo;

public class AppTest {

	public static void main(String[] args) {
		try {
			//返回指定的 host 和 port 上对远程对象 Registry 的引用。如果 host 为 null,则使用本地主机。 
			Registry registry = LocateRegistry.getRegistry("127.0.0.1", 8080);
			//返回注册表中绑定到指定 name 的远程引用
			UserInfoInterface userInfoInterface = (UserInfoInterface) registry.lookup("UserInfo");
			
			System.out.println("/*****************RMI String 返回********************/");
			System.out.println("用户名称:" + userInfoInterface.getUserName());
			System.out.println("用户密码:" + userInfoInterface.getUserPassword());
			
			System.out.println("/*****************RMI JavaBean 返回********************/");
			UserInfo userInfo = userInfoInterface.getUserInfo();
			System.out.println("用户部门:" + userInfo.getUser_dept());
			System.out.println("用户邮箱号:" + userInfo.getUser_email());
			
			System.out.println("/*****************RMI Map 返回********************/");
			Map<String,String> map = userInfoInterface.getUserInfoMap();
			System.out.println("Map用户编号:" + map.get("UserId"));
			System.out.println("Map用户密码:" + map.get("UserPassword"));
			
			System.out.println("/*****************RMI List<Object> List套JavaBean 返回********************/");
			List<UserInfo> userList = userInfoInterface.getUserInfoListBean();
			for (int i = 0; i < userList.size(); i++) {
				UserInfo users = (UserInfo)userList.get(i);
				System.out.println("用户名称:" + users.getUser_name() + "--部门:" + users.getUser_dept() + "--邮箱:" + users.getUser_email());
			}
			
			System.out.println("/*****************RMI List套Map 返回********************/");
			List<Map<String,String>> cityList = userInfoInterface.getCityInfoListMap();
			for (int i = 0; i < cityList.size(); i++) {
				Map<String,String> mapCity = (Map<String,String>)cityList.get(i);
				System.out.println("城市名称:" + mapCity.get("cityName") + "----区域:" + mapCity.get("cityArea"));
			}
			
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NotBoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

Client端也编写完成,运行Server端工程里的AppEntry,控制台打印:服务器已经准备就绪,可随时调用。

再运行Client端工程里的AppTest,控制台打印结果:

/*****************RMI String 返回********************/
用户名称:系统管理员
用户密码:888888
/*****************RMI JavaBean 返回********************/
用户部门:信息化建议中心
用户邮箱号:admin@zyujie.com
/*****************RMI Map 返回********************/
Map用户编号:admin
Map用户密码:888888
/*****************RMI List<Object> List套JavaBean 返回********************/
用户名称:用户111--部门:行政部--邮箱:userOne@zyujie.com
用户名称:用户222--部门:人力资源部--邮箱:userTwo@zyujie.com
用户名称:用户333--部门:销售部--邮箱:userThree@zyujie.com
/*****************RMI List套Map 返回********************/
城市名称:沈阳----区域:东北
城市名称:北京----区域:华北
城市名称:上海----区域:华东
城市名称:广州----区域:华南
城市名称:西安----区域:西北
城市名称:成都----区域:西南

JAVA RMI的小例子就成功实现了。小例子中返回了几种开发中很常用的结构类型。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值