发表于: 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 框架相关基础知识.
三.遇到问题
暂无.
四.收获
以上.
评论