您的位置:首页 > 编程语言 > Java开发

JAVA RMI远程方法调用简单实例

2016-04-13 11:50 543 查看
RMI的概念:
RMI(Remote Method Invocation)远程方法调用是一种计算机之间利用远程对象互相调用实现双方
通讯的一种通讯机制。使用这种机制,某一台计算机上的对象可以调用另外一台计算机上的对象来
获取远程数据。RMI是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。
在过去,TCP/IP套接字通讯是远程通讯的主要手段,但此开发方式没有使用面向对象的方式实现开发,
在开发一个如此的通讯机制时往往令程序员感觉到乏味,对此RPC(Remote Procedure Call)应运而生,
它使程序员更容易地调用远程程序,但在面对复杂的信息传讯时,RPC依然未能很好的支持,
而且RPC未能做到面向对象调用的开发模式。针对RPC服务遗留的问题,RMI出现在世人面前,
它被设计成一种面向对象的通讯方式,允许程序员使用远程对象来实现通信,并且支持多线程的服务,
这是一次远程通讯的革命,为远程通信开辟新的里程碑。

RMI的开发步骤:
1.先创建远程接口及声明远程方法,注意这是实现双方通讯的接口,需要继承Remote
2.开发一个类来实现远程接口及远程方法,值得注意的是实现类需要继承UnicastRemoteObject
3.通过javac命令编译文件,通过java -server 命令注册服务,启动远程对象
  4.最后客户端查找远程对象,并调用远程方法

简单实例:
1.先创建远程接口及声明远程方法,注意这是实现双方通讯的接口,需要继承Remote
2.开发一个类来实现远程接口及远程方法,值得注意的是实现类需要继承UnicastRemoteObject
3.通过javac命令编译文件,通过java -server 命令注册服务,启动远程对象
   4.最后客户端查找远程对象,并调用远程方法
首先为服务建立一个Model层,注意因为此对象需要现实进行远程传输,所以必须继承Serializable

package com.demo.rmi.model;

import java.io.Serializable;

//注意对象必须继承Serializable
public class PersonEntity implements Serializable {
/**
*
*/
private static final long serialVersionUID = -8311540511634667613L;

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,注意远程接口需要继承Remote

package com.demo.rmi.service;

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.List;
import com.demo.rmi.model.*;

//此为远程对象调用的接口,必须继承Remote类
public interface PersonService extends Remote {
public List<PersonEntity> GetList() throws RemoteException;
}

建立PersonServiceImpl实现远程接口,注意此为远程对象实现类,需要继承UnicastRemoteObject

package com.demo.rmi.serviceImpl;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.LinkedList;
import java.util.List;

import com.demo.rmi.model.PersonEntity;
import com.demo.rmi.service.*;

//此为远程对象的实现类,须继承UnicastRemoteObject
public class PersonServiceImpl extends UnicastRemoteObject implements PersonService {

/**
*
*/
private static final long serialVersionUID = 8709671494934206832L;

public PersonServiceImpl() throws RemoteException {
super();
// TODO Auto-generated constructor stub
}

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;
}
}
建立服务器端,在服务器端注册RMI通讯端口与通讯路径

package com.demo.rmi.remotingservice;

import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;

import com.demo.rmi.service.*;
import com.demo.rmi.serviceImpl.*;

public class Program{

public static void main(String[] args) {
try {
PersonService personService=new PersonServiceImpl();
//注册通讯端口
LocateRegistry.createRegistry(5555);
//注册通讯路径
Naming.rebind("rmi://127.0.0.1:5555/PersonService", personService);
System.out.println("Service Start!");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

最后建立客户端进行测试,注意客户调用的RMI路径必须服务器配置一致

package com.demo.rmi.remotingclient;

import java.rmi.Naming;
import java.util.List;

import com.demo.rmi.model.PersonEntity;
import com.demo.rmi.service.*;

public class Program {
public static void main(String[] args){
try{
//调用远程对象,注意RMI路径与接口必须与服务器配置一致
PersonService personService=(PersonService)Naming.lookup("rmi://127.0.0.1:5555/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();
}
}
}

注意整个层级结构为:



将编译文件放在与src同级的out目录中。

C:\Users\DELL>d:

D:\>cd src

D:\src>javac -d ../out com/demo/rmi/model/*java

D:\src>javac -d ../out com/demo/rmi/service/*java

D:\src>javac -d ../out com/demo/rmi/serviceimpl/*java

D:\src>javac -d ../out com/demo/rmi/remotingservice/*java

通过javac命令编译文件,通过java -server 命令注册服务

 java -cp ../out com/demo/rmi/remotingservice/Program
显示结果:Service Start!
打开另外一个cmd终端,进入相同的src路径,执行如下命令,编译。
D:\src>javac -d ../out com/demo/rmi/remotingclient/*java

D:\src>java -cp ../out com/demo/rmi/remotingclient/Program

显示结果:



另外一个终端则显示:


测试完成!

参考文章:http://www.cnblogs.com/leslies2/archive/2011/05/20/2051844.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: