专栏首页奔跑的蛙牛技术博客分布式对象之客户\服务器角色以及RMI初探

分布式对象之客户\服务器角色以及RMI初探

无所不在的java对象

程序员希望通过无所不在的java对象来作为所有问题的解决之道,思想就是通过网络请求相互协作。我可以调用一个远程对象帮我得到我所要的信息,并作为响应的一部分返回

引出客户与服务器角色

分布式编程的基本思想就是:客户端请求服务器,服务器根据请求处理得到客户端需要的信息返回

对象传递在各端

使用代理的远程方法调用

image.png

java的远程方法调用

  • RMI,java远程方法调用技术,支持java分布式对象之间的调用

远程方法调用

分布式计算的关键就是远程方法调用 实现的点

  1. 参数必须以某种方式传递到另一台机器上
  2. 服务器得到通知去定位远程对象
  3. 将响应值返回

存根

客户代码在远程对象调用一个远程方法实际上调用的是一个代理对象的普通方法,称此对象为存根

Warehouse centralHouse = get sub object;
double price = centralWarehouse.getPrice("xxx")

存根一般位于客户端,他知道如何通过网路与服务器进行交互。存根会将参数打包称一组字节 对参数编码的过程称之为参数编组,参数编组的目的将参数转化为虚拟机传递的合适格式。RMI是通过序列化进行编码

  • 客户端构造存根的信息块

  1. 被使用远程对象的标识符
  2. 被调用方法的描述
  3. 被编码的参数
  • 服务端接收后的动作

  1. 定位调用的远程对象
  2. 调用所需的方法,并传递客户端提供的参数
  3. 捕获返回值或调用产生的异常
  4. 将返回值编组打包返回给客户端存根

以上方法的信息流图

参数编组

RMI编程模型

建立一个简单的实例--->远程对象表示为一个仓库,客户端通过远程仓库获取产品价格

1. 接口实现

接口描述远程对象所实现的服务

// wareHouse.java
import java.rmi.*
public interface WareHouse extends Remote{
  double getPrice(string desciption) throws RemoteException;
}

服务器提供的类

// WarehouseImpl.java
import java.rmi.*
import java.rmi.server.*
import java.util.*

public class WarehouseImpl extends UnicastRemoteObject implements WareHouse{
  private Map<String,Double> prices;
  public WarehouseImpl throws RemoteException{
    prices = new HashMap<>();
    prices.put("1xx",23.1);
    prices.put("2xx",23.4);
  }
  public double getPrice(String description) throws RemoteException{
    Double prices = prices.get(description);
    return prices?0:prices;
  }
}

客户端RMI注册表

要调用远程对象,首先需要一个本地的存根对象此时需要调用远程方法获取第一个存根对象。服务器通过自居注册服务注册至少一个远程对象

// 下面代码构造并实现一个对象
import java.rmi.*
import java.naming.*
public class WarehouseServer {
  public static void main(String args[]){
    WarehouseImpl centralHouse = new WarehouseImpl();
    Context nameContext = new InitialContext();
    namingContext.bind("rmi:centrl_wareHouse",centralHouse);
  }
}

客户端通过下面方式获得存根

String url = "rmi://xx.xx.com/centrl_wareHouse"; Warehouse centralWareHouse = (Warehouse) nameingContext.lookup(url);

获取价钱流程图

image.png

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java 实现二叉树的构建以及3种遍历方法

    大二下学期学习数据结构的时候用C介绍过二叉树,但是当时热衷于java就没有怎么鸟二叉树,但是对二叉树的构建及遍历一直耿耿于怀,今天又遇见这个问题了,所以花了一下...

    Rekent
  • Java TCP通信概念及实例

                  <1>TCP:类似于电话系统,建立双向的通信通道,确定连接,话音顺序接听。

    Rekent
  • 详尽! Win10安装Java8+Tomcat9!

    Java也好, Tomcat也好, 都是很实用的啦, 早点掌握还是有必要的. 喜欢记得点赞哦, 有意见或者建议评论区哦, 当然暗中关注我也是可以的.

    SeanDepp
  • Java 循环队列的实现

      队列(Queue)是限定只能在一端插入、另一端删除的线性表。允许删除的一端叫做队头(front),允许插入的一端叫做队尾(rear),没有元素的队列称为“空...

    Rekent
  • Java 冒泡排序与快速排序的实现

          (1)基于交换思想的排序算法         (2)从一端开始,逐个比较相邻的两个元素,发现倒序即交换。           (3)一次遍历,一定能...

    Rekent
  • Java 线程池的实现

            任务接口:每个任务必须实现的接口,主要用来规定任务的入口、任务执行完后的收尾工作、任务的执行状态等。 工作线程通过该接口调度任务的执行。

    Rekent
  • 使用Solr涡轮增压您的WordPress搜索

    由于无法建议搜索短语,捕捉拼写错误,理解单词变体,组织和过滤结果以及索引搜索结果文档,因此WordPress内置的标准搜索无法为访问者提供最佳搜索体验。全文搜索...

    GongAo啊_
  • Java 通过先序中序序列生成二叉树

      二叉树的前序以及后续序列,以空格间隔每个元素,重构二叉树,最后输出二叉树的三种遍历方式的序列以验证。

    Rekent
  • 栈的Java简单实现

      进行插入和删除操作的一端称为“栈顶”(top),另一端称为“栈底”(bottom)。

    Rekent
  • Java UDP的简单实例以及知识点简述

      Java中实现UDP协议的两个类,分别是DatagramPacket数据包类以及DatagramSocket套接字类。

    Rekent

扫码关注云+社区

领取腾讯云代金券