远程通讯之rmi开发案例1---Java基础实现rmi功能

在这里我声明:这里的源码是我从网上copy下来的,详见大神篇:http://blog.csdn.net/leslies2/article/details/6436847

为了便于自己永久记录自己的RMI实战,特此记录。。。

 

关于任何一个知识我都比较喜欢从基础学起,这也常常让我很痛苦,不过没办法,我不太喜欢不了解机理就去学习高层封装的一些技术。

这篇文章的初衷也是如此,我是为了应用spring3.2.3对RMI的封装及应用才来了解和学习Java最基础的RMI实现。

 

第一步:你首先要去百度什么是RMI,及RMI是干啥的,不赘述。

第二步:为了便于你再现我的场景,我详细列出我的环境:

         开发工具:Eclipse j2ee Kepler(开普勒版本,好像是3.4+吧,这个应该没啥影响),jdk6,

第三部:新建普通项目:j2se项目,目录如下:

远程通讯之rmi开发案例1---Java基础实现rmi功能_第1张图片

上面显示了我的涉及的类名,具体的内容如下:

这是实体类PersonEntity

package rmi.model;
import java.io.Serializable;
//注意对象必须继承Serializable
public class PersonEntity implements Serializable {
    private int id;
    private String name;
    private int age;
	public void setId(int id) {
		this.id = id;
	}
	public int getId() {
		return id;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public int getAge() {
		return age;
	}
}


这是服务端应用接口PersonService:

package rmi.service;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.List;
import rmi.model.*;
//此为远程对象调用的接口,必须继承Remote类
public interface PersonService extends Remote {
    public List<PersonEntity> GetList() throws RemoteException;
}


下面是服务端接口的实现类PersonServiceImpl

package rmi.serviceImpl;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.LinkedList;
import java.util.List;
import rmi.model.PersonEntity;
import rmi.service.*;
//此为远程对象的实现类,须继承UnicastRemoteObject
public class PersonServiceImpl extends UnicastRemoteObject implements PersonService {
	public PersonServiceImpl() throws RemoteException {
		super();
		// TODO Auto-generated constructor stub
	}
	@Override
	public List<PersonEntity> GetList() throws RemoteException {
		// TODO Auto-generated method stub
		System.out.println("Get Person Start!");
		List<PersonEntity> personList=new LinkedList<PersonEntity>();
		
		PersonEntity person1=new PersonEntity();
		person1.setAge(25);
		person1.setId(0);
		person1.setName("Leslie");
		personList.add(person1);
		
		PersonEntity person2=new PersonEntity();
		person2.setAge(25);
		person2.setId(1);
		person2.setName("Rose");
		personList.add(person2);
		
		return personList;
	}
	
}


接下来是服务器端的服务启动类Program:

package rmi.remotingservice;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
 
import rmi.service.*;
import rmi.serviceImpl.*;
public class Program{
	public static void main(String[] args) {
		// TODO Auto-generated method stub
        try {
			PersonService personService=new PersonServiceImpl();
			//注册通讯端口
			LocateRegistry.createRegistry(6666);
			//注册通讯路径
			Naming.rebind("rmi://192.168.0.234:6666/PersonService", personService);
			System.out.println("Service Start!");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 

接下来是客户端的调用类ProgramC:

package rmi.remotingclient;
import java.rmi.Naming;
import java.util.List;
import rmi.model.PersonEntity;
import rmi.service.*;
public class ProgramC {
    public static void main(String[] args){
    	try{
    		//调用远程对象,注意RMI路径与接口必须与服务器配置一致
    		PersonService personService=(PersonService)Naming.lookup("rmi://192.168.0.234:6666/PersonService");
    		List<PersonEntity> personList=personService.GetList();
    		for(PersonEntity person:personList){
    			System.out.println("ID:"+person.getId()+" Age:"+person.getAge()+" Name:"+person.getName());
    		}
    	}catch(Exception ex){
    		ex.printStackTrace();
    	}
    }
}


这里我要强调原理下:RMI的目的是实现远程调用服务端接口,从而调用服务端的数据。

所以我在测试的时候,使用两台机子,服务器就是我的机子,ip:192.168.0.234 ,大家看到在服务端启动类Program和客户端调用类里的ip就是我的ip,可见,RMi不关心客户端ip,只要求服务端ip及在同一网段(你也可以用虚拟机实现我的两台机子的环境)。

测试方法:

步骤1:我的机子(192.168.0.234)是服务器,启动服务就是运行服务端启动类Program类,因为在Eclipse环境下,右击运行就行。(当然你也可以在cmd里运行Program.class),这时会看到输出信息:“Service start”

步骤2:给你的另一台机子装上jdk6 ,然后去Eclipse的工作空间里把所有的class都拷贝出来,放在另一台机子的c盘下,删除掉里面remotingservice包和serviceImpl包,

这时你的另一台机子的C盘下的rmi目录应该就剩下实体类ProgramC及它的包、服务端接口PersonService及它的包,

步骤3:打开cmd,进入命令提示符输入java   rmi/remotingclinet/ProgramC,看到了输出了服务端的信息。好开心啊。。。

你可能感兴趣的:(远程通讯之rmi开发案例1---Java基础实现rmi功能)