1.1初识

hprose是个开源RPC框架。支持语言 JAVA, C#,C++,Python,PHP等一系列语言。这里着重分析下hprose for

java源码。

可以到https://github.com/hprose/hprose-java 下载源码。我下载的版本是2.0.36,之后以这个版本为基础展开分析。

下载后,解压。

在eclipse中新建一个java工程 hprose,然后将下载解压目录下的src下面的代码复制到hprose工程中,可能会发现有几处编译不过,这是因为缺少了几个jar。 servlet-api.jar,

javax.websocket-api-1.0-rc4.jar

解决办法:

1. 下载tomcat,解压到某个目录,如 d:\tomcat

在hprose中添加对文件 d:\tomcat\lib\servlet-api.jar的引用

2. 下载 javax.websocket-api.jar ,在hprose工程添加其引用

经过这2步,就可以解决编译问题了。下图展示了在哪里添加引用。

下面开始hprose源码分析之旅吧。

1.2何为RPC

RPC( remote procedure call),远程过程调用。要调用的过程不在本机,而是在一台服务器上。RPC调用机制使得与调用本机函数没有差别,只是RPC调用要经过网络。

1.3 RPC调用流程

1. 客户端发起一个RPC调用

2. 被调用函数的函数名,参数列表 封装成一个数据包,把数据包发往服务器端

3. 服务器未返回数据时,客户端处于等待状态

4. 服务器收到请求函数调用的数据包,根据函数名,找到对应函数,取出调用参数,然后调用。

5. 服务器返回调用结果

6. 客户端接收到调用结果,并且将这个结果返回给调用者。

hprose框架完成的就是上面的工作,下面将逐渐展开分析。

1.4从哪里开始

hprose工程建好后,可以看到图示包列表,内容不少,从哪里开始呢?有道是擒贼先擒王,打蛇打七寸,需要做的工作就是先抓主干。RPC的主干是什么?就是1.3中所述的RPC调用流程,先把这个流程弄通,其他旁枝就好办了。在分析过程中,会遇到一些细节上的障碍,不防事。各位看客,请听我慢慢道来。

1.5起点

从hprose给出的示例中可以到客户端如何发启一个RPC调用

interface IHello { String hello(String name); }

public class TestClient {

public static void main(String[] args) {

HproseTcpClient client = new HproseTcpClient("tcp://127.0.0.1:4321/");

client.setFullDuplex(true);

client.setMaxPoolSize(1);

IHello obj = client.useService(IHello.class);

String str = obj.hello( "world" );

System.out.println( str );

}

}

粘代码真是浪费篇幅,没办法,为了看的清楚些,还是粘了一些。不过没粘全,像import这类语句没粘,这些可以在示例中找到。闲言少叙,还是看下重点。

1. HproseTcpClient client = new HproseTcpClient("tcp://127.0.0.1:4321/");

生成一客户端实例,表示 客户端要 通过 tcp 连接 本机上的一个端口为4321 的服务器。

2. IHello obj = client.useService(IHello.class); 生成一个动态代理

3. String str = obj.hello( "world" ); 调用并返回结果。本步骤调用函数 hello,并不是调用客户端上的

hello函数,而是将调用数据发送到了服务器端,在服务器找到名为hello的函数,然后调用。

神奇,这一切是如何发生的?obj.hello("world"), 调用的是接口 IHello中的一个方法,但上面的代码没有实现 IHello接口呀。看来秘密就在第2步, 生成一个动态代理。

1.6动态代理

动态代理是什么鬼,还能不能好好分析了。这是只拦路虎,不解决它,无法继续下去,前进路上的障碍要想办法扫除。

前面提到了接口IHello,要想使用它,需要定义一个实现类,比如 class MyHello implements IHello{}

然后生成一个MyHello的实例,就可以调用其中的方法 hello()了。是的,定义一个实现类,然后使用。

其实MyHello就是一个代理,只不过这是自己手动定义的。动态代理是不需要手动去定义,而是自动生成了IHello的实现类。既然可以手动定义,自己定义一个实现类,直接使用不就可以了吗?为何还需要借助于动态代理呢。

事情没有这么简单。

试想,hprose框架在设计时,是无法知道用户会定义一个什么样的接口,更别提写一个实现类了。但又为了方便用户,可以通过接口来使用这个RPC框架,那就有必要做一个动态的东西出来。用户只需要把接口定义好,

然后调用框架提供的工具函数,生成一个动态代理对象,根据这个对象,去调用接口中的方法,其他事情,像连接服务器,向服务器发送数据包,等复杂工作,统统交给框架。这就是动态代理缘由。

还是来看下源码吧。

(函数在 HproseClient.java文件内。)

函数297行,调用Proxy.newProxyInstance(),这是jdk api。

看下这个api的各个参数

参数1: ClassLoader

参数2: 接口类型列表

参数3: 一个回调

着重看下参数3,它是一个回调接口,

public interface InvocationHandler

{

public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable;

} ( jdk中定义 )

proxy,是动态代理的实例对象

method,是要调用的方法

args,调用参 数列表

什么,还是不明白?绕来绕去的,到底想说什么。下篇揭晓其真面目。

欲知后事如何,且听下回分解。

python打蛇_hprose for java源码分析-1 初识相关推荐

  1. hprose for java 教程_hprose for java源码分析-4

    4.1 疑窦丛生 书接上回.上回说到, 从HproseClient.java ------------------------- (#0) invokeHandler.handle()开始,将经历一个 ...

  2. 【Java源码分析】Java8的HashMap源码分析

    Java8中的HashMap源码分析 源码分析 HashMap的定义 字段属性 构造函数 hash函数 comparableClassFor,compareComparables函数 tableSiz ...

  3. 【Java源码分析】LinkedHashSet和HashSet源码分析

    类的定义 public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, ...

  4. java 源码分析_Java 源代码编译成 Class 文件的过程分析

    原标题:Java 源代码编译成 Class 文件的过程分析 在上篇文章< Java三种编译方式:前端编译 JIT编译 AOT编译 >中了解到了它们各有什么优点和缺点,以及前端编译+JIT编 ...

  5. Java源码分析之HashMap(JDK1.8)

    一.HashMap概述 HashMap是常用的Java集合之一,是基于哈希表的Map接口的实现.与HashTable主要区别为不支持同步和允许null作为key和value.由于HashMap不是线程 ...

  6. 坦克大战java源码分析(上)

    坦克大战源码分析 一.mytank07.java文件分析 注:至上而下将不懂的语句.结构体含义.代码作用等作出解释: 1.包的使用 package com.haiding.tank_7; 包语句的语法 ...

  7. 【Java源码分析】Java8的ArrayList源码分析

    Java8的ArrayList源码分析 源码分析 ArrayList类的定义 字段属性 构造函数 trimToSize()函数 Capacity容量相关的函数,比如扩容 List大小和是否为空 con ...

  8. Java源码分析 AbstractList的迭代器实现(Itr和ListItr)

    Itr和ListItr的简介 AbstractList的有两个内部类实现了迭代器,一个内部类Itr实现了Iterator接口,一个内部类ListItr实现了ListIterator接口,后者其实就是前 ...

  9. 【Java源码分析】ArrayList源码分析

    类的定义 public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAc ...

最新文章

  1. python range()内建函数
  2. 低配服务器装那个系统吗,用低配服务器好还是高配vps
  3. c语言开发环境 推荐,C语言复习和VC++6.0开发环境推荐.ppt
  4. webclient无法获取html文件,C# WebClient获取网页源码的方法
  5. multisim秒信号发生器_频谱中射频干扰信号流化、分析与回放
  6. python集合中的元素是否可以重复_python列表--查找集合中重复元素的个数
  7. 写随笔写日记多参与评论
  8. jquery ajax 向spring MVC controller中传值并接受及解析返回值
  9. 原生javascript知识点
  10. php session 加密,php session cookie加密实例
  11. 如何删除U盘中的System Volume Information文件夹?
  12. emoji字符串 php,使用emoji字符组成任意汉字
  13. 360云盘服务器停止怎么找回,360云盘宣布关闭,老司机们的“珍藏”何去何从?...
  14. Android第三方框架之学习高德地图SDK-----①集成环境,获取定位信息,地图显示。
  15. 刘畅清华大学计算机学院,刘畅
  16. 如何搭建储能监控云平台?
  17. APP运营如何实现流量变现,获取更高收益?
  18. Sass函数-Miscellaneous函数(三元条件函数)
  19. HTML微信单页引流项目源码模板分享
  20. Linux下使用github

热门文章

  1. 斯特灵公式求阶乘c语言,斯特林公式 ——Stirling公式(取N阶乘近似值)
  2. 亚马逊、速卖通、temu、Cdiscount通过自养号给自己店铺测评补单需要哪些技巧?
  3. 怎么用计算机打印出东西,如何把需要的东西打印出来?谢谢,我是新手
  4. Maven打包到指定位置
  5. ES中mapping讲解
  6. 地摊:阿里、拼多多、京东们的新战场
  7. 3D美术 18——max中运用运动捕捉,解决导入BIP时所有骨骼变成塌陷针(黑帧)的问题
  8. 如何用油漆桶工具进行配色
  9. 关于在ubuntu上调试ODOO8.0的几个问题
  10. 微信小程序 转发、分享、收藏、复制链接