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
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
相关文章推荐
- Mac安装MyEclipse
- Spring使用Cache、整合Ehcache
- myeclipse 8.6 安装maven3.0报错ERROR: JAVA_HOME is set to an invalid directory
- [Java]生成Excel
- JFreeCharts绘画折线(柱状图)
- Java中的可变参数
- Java系列笔记(2) - Java RTTI和反射机制
- Java多态
- Demo for Cockroach
- myeclipse10.7打包war包出错
- Java NIO:NIO概述
- Java NIO:浅析I/O模型
- eclipse web工程中jndi数据源设置
- myeclipse项目中有个感叹号是什么原因
- Java字符串操作汇总
- [Java] 过滤文件夹
- 记一次线上应用连接池满的处理
- java并发系列:深入分析Synchronized
- 使用Spring MVC统一异常处理实战
- 深入理解 Java中的 流 (Stream)