发表于: 2017-10-12 23:28:40

1 657


今天完成的事情:

rmi底层实现原理

远程方法调用(RMI)顾名思义是一台机器上的程序调用另一台机器上的方法,其主要目的就是要使运行在不同的计算机中的对象之间的调用表现得像本地调用一样。从而可以实现分布式计算。

简单来说,用户知道工匠的名字,知道工匠的地址,然后用户通过工匠的地址和名字去找到工匠,让工匠干活。

RMI应用程序通常包含两个单独的程序,一个服务器和一个客户机。典型的服务器程序创建一些远程对象,使对这些对象的引用可访问,并等待客户端调用这些对象上的方法。典型的客户端程序获取对服务器上的一个或多个远程对象的远程引用,然后调用它们上的方法。RMI提供了服务器和客户端来回传递信息的机制。这种应用有时被称为分布式对象应用。

在 RMI 中, 远程服务的定义是存放在继承了 Remote 的接口中。远程服务的实现代码存放在实现该定义接口的类中。

RMI 支持两个类实现一个相同的远程服务接口: 一个类实现行为并运行在服务器上, 而另一个类作为一个远程服务的代理运行在客户机上。

客户程序发出关于代理对象的调用方法, RMI 将该调用请求发送到远程 JVM 上, 并且进一步发送到实现的方法中。实现方法将结果发送给代理, 再通过代理将结果返回给调用者。

stubs和skeletons起到了什么作用?

存根( Stub) 和骨架( Skeleton) 合在一起形成了 RMI 构架协议,负责网络通信相关的功能

stub担当远程对象的客户本地代表或代理人角色,负责把要调用的远程对象方法的方法名及其参数编组打包,并将该包转发给远程对象所在的服务器

调用stub的方法时将执行下列操作:

(1)与服务端的skeleton建立socket连接(2) 对参数进行打包(写入并传输)

(3) 等待方法调用结果

(4) 解包(读取)返回值或返回的异常

(5) 结果返回给客户端

Skeleton运行服务端上,接受来自stub对象的调用。当skeleton接收到来自stub对象的调用请求后,skeleton会作如下工作:

(1) 解包(读取)stub传来的参数

(2) 调用匹配实现上的方法

(3) 打包返回值或错误发送给stub对象

RMIRegistry的作用是什么?

java.rmi.Naming类提供存储和获得“远程对象注册表”上远程对象的引用的方法。Naming类的每个方法都使用URL格式的参数,一个//ip:port/name可以唯一定位一个RMI服务器上的发布了的对象

运行public static Remote lookup(String name)方法的时候,会生成一个stub对象,stub对象的构造参数需要一个RemoteRef类型的对象,

服务端运行public static void bind(String name, Remote obj)这个方法会传入一个实现类的引用作为第二参数,此时Naming会使用getClass来获取类的名字,并构建成stub

从实体类中获取RemoteRef对象,这个对象中就封装了服务端的细节,包括服务端的hostname、port。RMIRegistry会储存stub对象,并提供给客户端使用

public static Remote lookup(String name)
throws NotBoundException,
       java.net.MalformedURLException,
       RemoteException
{
ParsedNamingURL parsed = parseURL(name);
   Registry registry = getRegistry(parsed);

   if (parsed.name == null)
return registry;
   return registry.lookup(parsed.name);
}
public static void bind(String name, Remote obj)
throws AlreadyBoundException,
       java.net.MalformedURLException,
       RemoteException
{
ParsedNamingURL parsed = parseURL(name);
   Registry registry = getRegistry(parsed);

   if (obj == null)
throw new NullPointerException("cannot bind to null");

   registry.bind(parsed.name, obj);
}

看了看数组,ArrayList,LinkedList的区别和实现原理,有点晕。

尤其这个LinkedList理解起来还是有点问题,里边涉及到什么first,last,prev,next贼绕。。

比如这张图

乍看一下没什么,但是如果用LinkedList的增删改查的话,嗯。。。就变得很复杂了。。我再看看


返回列表 返回列表
评论

    分享到