发表于: 2017-11-05 23:05:31

1 798


一.今日完成

1.学习和了解Java Remote Method Invocation

(1)Java RMI 是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。允许使用Java编写分布式对象,可以用此方法调用的任何对象必须实现该远程接口。

(2)RMI优点

i.面向对象:RMI可将完整的对象作为参数和返回值进行传 递,而不仅仅是预定义的数据类型。

ii.可移动属性:RMI可将属性(类实现程序)从客户机移动 到服务器,或者从服务器移到客户机。

iii.设计方式:对象传递功能使您可以在分布式计算中充分 利用面向对象技术的强大功能,如二层和三层结构系统 。

iv.分布式垃圾收集:RMI采用其分布式垃圾收集功能收集不 再被网络中任何客户程序所引用的远程服务对象。

v.并行计算:RMI采用多线程处理方法,可使服务器利 用这些Java线程更好地并行处理客户端的请求。

(3)RMI远程调用步骤:

1)客户对象调用客户端辅助对象上的方法

2)客户端辅助对象打包调用信息(变量,方法名),通过网络发送给服务端辅助对象

3)服务端辅助对象将客户端辅助对象发送来的信息解包,找出真正被调用的方法以及该方法所在对象

4)调用真正服务对象上的真正方法,并将结果返回给服务端辅助对象

5)服务端辅助对象将结果打包,发送给客户端辅助对象

6)客户端辅助对象将返回值解包,返回给客户对象

7)客户对象获得返回值

对于客户对象来说,步骤2-6是完全透明的


2.Java RMI的实现

(1)创建一个接口,继承Remote

import java.rmi.Remote;
import java.rmi.RemoteException;
/**
* 定义远程接口,必须继承Remote接口,  
* 其中所有需要远程调用的方法都必须抛出RemoteException异常    
*/
public interface IHello extends Remote {

String sayHello(String name) throws RemoteException;
int sum(int a, int b)throws RemoteException;

}  

(2)创建接口的实现类

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class HelloImpl extends UnicastRemoteObject implements IHello{

private static final long serialVersionUID = 1961558474342609777L;

public HelloImpl()throws RemoteException {
super();
}


@Override
   public String sayHello(String name) {
return "Hello, " + name;
}


@Override
   public int sum(int a, int b) {

return a+b;
}

}  

接口的实现类同时要实现Serializable接口,这里继承UnicastRemoteObject也是间接实现Serializable接口.同时,因为构造方法需要抛出RemoteException,所以不能缺省使用隐含的无参构造方法,而应该显式定义构造方法。

(3)创建应用类,注册和启动服务端RMI,以被客户端调用

import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;

public class HelloServer {
public static void main(String args[]) {
try {
//创建一个远程对象  
           IHello rhello = new HelloImpl();
//生成远程对象注册表Registry的实例,并指定端口为8888(默认端口是1099)  
           LocateRegistry.createRegistry(8888);

//把远程对象注册到RMI注册服务器上,并命名为RHello  
           //绑定的URL标准格式为:rmi://host:port/name(协议名可以省略,下面两种写法都可以)  
           Naming.bind("rmi://127.0.0.1:8888/RHello", rhello);

System.out.println(">>INFO:远程IHello对象绑定成功!");
} catch (RemoteException e) {
System.out.println("创建远程对象发生异常!");
e.printStackTrace();
} catch (AlreadyBoundException e) {
System.out.println("发生重复绑定对象异常!");
e.printStackTrace();
} catch (MalformedURLException e) {
System.out.println("发生URL畸形异常!");
e.printStackTrace();
}
}
}  

(4)建立客户端.因为客户端需要有服务端那边提供的接口,才可以访问,所以要将服务端的IHello接口完全拷贝(连同包)到客户端,实际运用中通常是要服务端接口打成jar包来提供的。

(5)创建客户端调用类

public class HelloClient {
public static void main(String args[]) {
try {
// 在RMI服务注册表中查找名称为RHello的对象,并调用其上的方法  
           IHello rhello = (IHello) Naming.lookup("rmi://127.0.0.1:8888/RHello");
System.out.println(rhello.sayHello("world"));
System.out.println(rhello.sum(454, 5457));
} catch (Exception e) {
e.printStackTrace();
}
}


二.明日计划

1.学习Spring RMI;

2.继续梳理Spring 框架相关基础知识.


三.遇到问题

暂无.


四.收获

以上.





返回列表 返回列表
评论

    分享到