zoukankan      html  css  js  c++  java
  • RMI(Remote Method Invocation ) 概念恢复

    1、RMI是远程方法调用的简称,像其名称暗示的那样,它能够帮助我们查找并执行远程对象,通俗的说,远程调用就像一个class放在A机器上,然后在B机器中调用这个class的方法。

    2、EMI术语

    在研究代码之前,我们来看看必须编写哪些代码:

    远程对象:这个接口只定义了一个方法,我们应当明白的是,这个接口可以既包含方法的代码也包含方法的定义。远程对象包含要导出的每个方法的定义,并且实现Java.RMI中的远程接口。

    远程对象实现:这是一个实现远程对象的类。如果实现了远程对象,就能够覆盖该对象中的所有方法,因此,远程对象的实现类将真正包含我们希望=导出的方法代码。

    远程服务器:这是一个作为服务器使用的类,它是相对要远程访问方法的客户端而言的。它储存着绑定的字符串和对象。

    远程客户端:这是一个帮助我们访问远程方法提供帮助的类,它也是最终用户。

    Stub(存根)和Skeleton(骨架)

    Stub和Skeleton是经过RMIC命令生成的,我们的程序要通过远程调用,底层一定是套接字的字节传输,传输到服务器或者客户端的对端后,再把该对象反序列化为对应的对象,这些网络传输的过程要求安全、稳定等等非常麻烦的操作,Stub驻留客户端,承担着代理远程对象的实现者的角色,Skeleton类帮助远程对象与Stub在RMI连接上进行通信。RMI的客户与STUB进行交换,STUB与SKELETON通信,SKELETON负责与服务器进行交互,因此有了STUB和SKELETON之后我们就不要需要实现底层通信的细节,我们进行的远程调用,只需要通过接口对方法进行操作即可,使分布式调用实现了位置上的透明,即:远程调用就像本地调用一样。

    服务器端实现

    1.服务接口

    /**
    *服务接口
    *定义了行为集
    */
    import java.rmi.Remote;
    import java.rmi.RemoteException;
    public interface IHello extends Remote {
    
          /**
          * 在服务器打印客户端发过来的message 并返回“Hello World”字符串
          */
          public String sayHello(String message) throws RemoteException; 
    }

    2.服务实现

    /**
    *服务实现
    *继承UnicastRemoteObject
    */
    import java.rmi.server.UnicastRemoteObject;
    import java.rmi.RemoteException;
    public class HelloImpl  extends UnicastRemoteObject implements IHello {
         
         //必须的
         public HelloImpl() throws RemoteException {
             super();
         }
         
         @Override
         public String sayHello(String message) {
              System.out.println("================client message" + message);
              return "Hello World!";
         }
    
    } 

    3.启动RMI服务器并暴露服务

    /**
    *RMI服务器
    *1、创建一个服务
    *2、启动服务器
    *3、注册服务
    */
    import java.rmi.registry.*;
    import java.rmi.*;
    import java.rmi.server.*;
    
    public class HelloServer {
    
        public static void main(String[] args) throws Exception {
            
            //1
            IHello hello = new HelloImpl();
            
            //2启动服务器 启动一个注册表并把注册表绑定到一个端口(默认端口1099)
            LocateRegistry.createRegistry(8888);
            //3将服务注册到注册表  绑定的URL标准格式为:rmi://host:port/name(其中协议名可以省略,下面两种写法都是正确的) 
            Naming.bind("rmi://localhost:8888/hello", hello);
            
            System.out.println("========服务器启动了");
        
        }
    
    }

    客户端实现
    1.服务接口

    /**
    *服务接口
    *定义了行为集
    */
    import java.rmi.Remote;
    import java.rmi.RemoteException;
    public interface IHello extends Remote {
    
          /**
          * 在服务器打印客户端发过来的message 并返回“Hello World”字符串
          */
          public String sayHello(String message) throws RemoteException; 
    }

    2.客户端实现

    /**
    * 1、服务实现者是谁? 服务器
    * 2、如何获取服务 查找
    * 3、如何调用服务接口
    */
    import java.rmi.*;
    public class HelloClient {
    
         public static void main(String[] args) throws Exception {
            
            //1、查找服务
            IHello hello = (IHello)Naming.lookup("rmi://localhost:8888/hello");
            
            System.out.println(Naming.lookup("rmi://localhost:8888/hello"));
            //2、调用
            System.out.println(hello.sayHello("haha"));
            
         }
    }
  • 相关阅读:
    【树状数组】bzoj2743 [HEOI2012]采花
    【二分答案】bzoj1639 [Usaco2007 Mar]Monthly Expense 月度开支
    【二分答案】【最短路】bzoj1614 [Usaco2007 Jan]Telephone Lines架设电话线
    【二分答案】【Heap-Dijkstra】bzoj2709 [Violet 1]迷宫花园
    【二分答案】【字符串哈希】bzoj2084 [Poi2010]Antisymmetry
    【二分答案】【最大流】bzoj1305 [CQOI2009]dance跳舞
    【计算几何】【二分答案】【最大流】bzoj1822 [JSOI2010]Frozen Nova 冷冻波
    【二分答案】【最大流】bzoj3130 [Sdoi2013]费用流
    【动态规划】bzoj3992 [Sdoi2015]序列统计 10分
    【二分答案】【最大流】bzoj3993 [Sdoi2015]星际战争
  • 原文地址:https://www.cnblogs.com/runwulingsheng/p/5522495.html
Copyright © 2011-2022 走看看