1.RMI概述
远程访问允许客户机访问其他计算机的对象和服务,就像这些对象和服务就在本地一样。远程访问是分布式应用基础,也是JavaEE应用架构的基础之一。Java为远程访问提供了很好的简化,RMI是Java远程访问的重要规范之一,它允许本地Java程序直接调用远程Java方法。
2.RMI编程
下面通过一个实际的例子介绍一下RMI的编程方法.
2.1 开发RMI服务器
我们首先需要编写RMI服务器,RMI需要通过远程接口“暴露”服务。也就是说,所有想被客户端调用的方法都必须在Remote接口里声明,而远程接口必须继承Remote接口。具体代码如下:
import java.rmi.*;
public interface Server extends Remote {
String hello(String name) throws RemoteException;
Person getPerson(String name, int age) throws RemoteException;
}
上面代码用到了一个Person类,具体代码如下:
import java.io.Serializable;
public class Person implements Serializable{
private String name;
private int age;
public Person() {
};
public Person(String name, int age) {
this.name = name;
this.age = age;
}
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;
}
}
RMI服务是典型的面向接口编程,只有在远程接口中定义的方法才能对外提供远程服务,因此开发RMI服务器端程序时需要先为远程服务编写接口,再编写远程服务实现类。
下面是远程服务实现类,该类必须实现远程接口,且要继承java.rmi.server.UnicastRemoteObject类,继承该类可以“暴露”远程服务。
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;
public class ServerImpl extends UnicastRemoteObject implements Server {
protected ServerImpl() throws RemoteException {
}
public String hello(String name) throws RemoteException{
return "Hello " + name;
}
public Person getPerson(String name, int age) throws RemoteException{
return new Person(name, age);
}
public void info(){
System.out.println("I'm a local method!");
}
public static void main(String[] args) throws RemoteException, MalformedURLException{
Server imp = new ServerImpl();
LocateRegistry.createRegistry(9000);
Naming.rebind("rmi://:9000/rmi", imp);
}
}
在远程接口中没有定义的方法是不可以“暴露”给其他Java应用程序的。主函数内创建远程服务类的实例,并通过Naming类的bind()和rebind()方法将其绑定到指定JNDI名称。之后使用LocateRegistry类在程序内完成注册。
2.2 开发RMI客户端
RMI的客户端程序实现比较简单,只需两步:
① 通过JNDI查找提供远程RMI服务的对象,并执行强制类型转换。
② 调用远程方法。
具体代码如下:
import java.rmi.Naming;
public class RmiClient {
public static void main(String[] args) throws Exception{
Server ser = (Server)Naming.lookup("rmi://:9000/rmi");
System.out.println(ser.hello("ti"));
System.out.println(ser.getPerson("ti",40));
}
}
程序的运行结果如下:
Hello ti
Person@1c0e45a
客户端使用JNDI查找到服务对象后,将其强制转换为远程接口的类型,接下来就可以直接调用方法了。需要注意的是,远程接口的方法返回值要在网络上传输,所以要求返回值可以实现序列化。所以Person类实现了Serializable接口。
该贴被xiuwen.zhao编辑于2014-8-26 16:36:20该贴由koei123转至本版2015-6-2 8:56:17