zoukankan      html  css  js  c++  java
  • java rmi浅谈

    首先比较下RPC和RMI的差别:

    首先java提供了RMI的api,jdk1.5之后虚拟机自动生成两个类:存根类stub和骨架类skelton。 stub是给客户端的,当客户端调用远程对象的一个方法时,实际上是调用本地存根对象的相应方法。skelton负责在服务端为远程对象接受客户端的请求。RMI必须要有JVM支持,所以,如果C,S都使用java开发,可以考虑使用RMI。

    RPC可以跨语言,客户端请求参数中就带有需要调用的类,方法及参数

    ----------------------------------------以上是个人理解----------------------------------------------------

    下面3个区别转自:http://blog.csdn.net/shan9liang/article/details/8995023

    (1)RPC 跨语言,而 RMI只支持Java。

    (2)RMI 调用远程对象方法,允许方法返回 Java 对象以及基本数据类型,而RPC 不支持对象的概念,传送到 RPC 服务的消息由外部数据表示 (External Data Representation, XDR) 语言表示,这种语言抽象了字节序类和数据类型结构之间的差异。只有由 XDR 定义的数据类型才能被传递, 可以说 RMI 是面向对象方式的 Java RPC 。

    (3)在方法调用上,RMI中,远程接口使每个远程方法都具有方法签名。如果一个方法在服务器上执行,但是没有相匹配的签名被添加到这个远程接口上,那么这个新方法就不能被RMI客户方所调用。

    在RPC中,当一个请求到达RPC服务器时,这个请求就包含了一个参数集和一个文本值,通常形成“classname.methodname”的形 式。这就向RPC服务器表明,被请求的方法在为 “classname”的类中,名叫“methodname”。然后RPC服务器就去搜索与之相匹配的类和方法,并把它作为那种方法参数类型的输入。这里 的参数类型是与RPC请求中的类型是匹配的。一旦匹配成功,这个方法就被调用了,其结果被编码后返回客户方。

    远程对象需继承Remote接口,每个方法都需要throws RemoteException, 通过此接口提供业务功能,然后将其绑定到某个端口上提供远程服务

    public interface Business extends Remote {
        public String echo(String message) throws RemoteException;
    }
    public class BusinessImpl implements Business {
    
        @Override
        public String echo(String message) throws RemoteException {
            if("quit".equalsIgnoreCase(message)){
                System.out.println("server will be shut down");
                System.exit(0);
            }
            return "server response" + message;
        }
    }

    server:

    public class Server {
        public static void main(String[] args) throws RemoteException{
            int port = 1233; //该端口负责提供服务
            String name = "BusinessDemo";
            Business business = new BusinessImpl();
            UnicastRemoteObject.exportObject(business,port);  //如果BusinessImpl继承了UnicastRemoteObject  这行代码可以不写
            Registry registry = LocateRegistry.createRegistry(1234); //该端口负责注册与查询服务,客户端只需要知道这个端口号就行了
            registry.rebind(name, business);
        }
    }

    client:

    public class Client {
        public static void main(String[] args) throws RemoteException, NotBoundException{
            Registry registry = LocateRegistry.getRegistry("127.0.0.1",1234); //如果cs要布在两台机器上,这儿的ip填server的ip即可
            String name = "BusinessDemo";
            Business business = (Business) registry.lookup(name); //执行到这儿的时候才访问server
            System.out.print(business.echo("hello"));
        }
    }
  • 相关阅读:
    Managing C++ Objects: 管理C++对象 —— 一些建议准则
    像Java一样管理对象:T&形式仅仅用在参数传递
    Visual Studio的语法着色终于调得赏心悦目
    j.u.c: Java并发包的5大块
    笔记:Java Language Specification
    线程与锁
    分布式系统涉及的基本问题
    微服务为什么是一种趋势
    js实现复制功能
    css label两端对齐
  • 原文地址:https://www.cnblogs.com/hithlb/p/4582220.html
Copyright © 2011-2022 走看看