发表于: 2017-07-06 15:45:23
2 1123
今日完成
任务7的api接口实现进展卡住了,先做任务8,9分布式吧
使用spring对RMI的支持,可以非常容易地构建你的分布式应用。在服务端,可以通过Spring的org.springframework.remoting.rmi.RmiServiceExporter可以暴露你的服务;在客户端,通过org.springframework.remoting.rmi.RmiProxyFactoryBean可以使用服务端暴露的服务,非常方便。这种C/S模型的访问方式,可以屏蔽掉RMI本身的复杂性,如服务端Skeleton和客户端Stub等的处理细节,这些对于服务开发和服务使用的人员来说,都是透明的,无需过度关注,而集中精力开发你的商业逻辑。
java rmi的实现
创建接口继承remote
- package rmi.java;
- import java.rmi.Remote;
- import java.rmi.RemoteException;
- /**
- * 定义远程接口,必须继承Remote接口,
- * 其中所有需要远程调用的方法都必须抛出RemoteException异常
- */
- public interface IHello extends Remote {
- public String sayHello(String name) throws RemoteException;
- public int sum(int a, int b)throws RemoteException;
创建接口的实现类
- package rmi.java;
- 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;
- }
- }
创建应用类,注册和启动服务端RMI,以被客户端调用
- package rmi.java;
- 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();
- }
- }
- }
下面建立客户端
因为客户端需要有服务端那边提供的接口,才可以访问,所以要将服务端的IHello接口完全拷贝(连同包)到客户端,当然为了方便,你在客户端工程中新建一个完全一样的接口也可以。实际运用中通常是要服务端接口打成jar包来提供的。
创建客户端调用类
- package rmi.java;
- import java.rmi.Naming;
- 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();
- }
- }
- }
收获
初步理解rmi的概念
困难
无
明日计划
整合spring 和rmi
评论