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"));
            
         }
    }
  • 相关阅读:
    微信商城中使用微信支付接口获取用户地址
    微信支付开发流程
    沉默多年,重新开博
    Extjs 表单验证后,几种错误信息展示方式
    自己对Extjs的Xtemplate的忽略
    js execCommand
    支付宝支付
    C# 将短时间格式变长正常时间格式
    SortedDictionary
    sql操作
  • 原文地址:https://www.cnblogs.com/runwulingsheng/p/5522495.html
Copyright © 2011-2022 走看看