百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

hprose for java源码分析-1(java for循环)

toyiye 2024-08-17 00:14 7 浏览 0 评论

1.1初识

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

java源码。

可以到 github或hprose官网下载源码。我下载的版本是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 3 # Python 3字典Dictionary(1)

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中,格式如...

Python第八课:数据类型中的字典及其函数与方法

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值...

Python中字典详解(python 中字典)

字典是Python中使用键进行索引的重要数据结构。它们是无序的项序列(键值对),这意味着顺序不被保留。键是不可变的。与列表一样,字典的值可以保存异构数据,即整数、浮点、字符串、NaN、布尔值、列表、数...

Python3.9又更新了:dict内置新功能,正式版十月见面

机器之心报道参与:一鸣、JaminPython3.8的热乎劲还没过去,Python就又双叒叕要更新了。近日,3.9版本的第四个alpha版已经开源。从文档中,我们可以看到官方透露的对dic...

Python3 基本数据类型详解(python三种基本数据类型)

文章来源:加米谷大数据Python中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在Python中,变量就是变量,它没有类型,我们所说的"类型"是变...

一文掌握Python的字典(python字典用法大全)

字典是Python中最强大、最灵活的内置数据结构之一。它们允许存储键值对,从而实现高效的数据检索、操作和组织。本文深入探讨了字典,涵盖了它们的创建、操作和高级用法,以帮助中级Python开发...

超级完整|Python字典详解(python字典的方法或操作)

一、字典概述01字典的格式Python字典是一种可变容器模型,且可存储任意类型对象,如字符串、数字、元组等其他容器模型。字典的每个键值key=>value对用冒号:分割,每个对之间用逗号,...

Python3.9版本新特性:字典合并操作的详细解读

处于测试阶段的Python3.9版本中有一个新特性:我们在使用Python字典时,将能够编写出更可读、更紧凑的代码啦!Python版本你现在使用哪种版本的Python?3.7分?3.5分?还是2.7...

python 自学,字典3(一些例子)(python字典有哪些基本操作)

例子11;如何批量复制字典里的内容2;如何批量修改字典的内容3;如何批量修改字典里某些指定的内容...

Python3.9中的字典合并和更新,几乎影响了所有Python程序员

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

Python3大字典:《Python3自学速查手册.pdf》限时下载中

最近有人会想了,2022了,想学Python晚不晚,学习python有前途吗?IT行业行业薪资高,发展前景好,是很多求职群里严重的香饽饽,而要进入这个高薪行业,也不是那么轻而易举的,拿信工专业的大学生...

python学习——字典(python字典基本操作)

字典Python的字典数据类型是基于hash散列算法实现的,采用键值对(key:value)的形式,根据key的值计算value的地址,具有非常快的查取和插入速度。但它是无序的,包含的元素个数不限,值...

324页清华教授撰写【Python 3 菜鸟查询手册】火了,小白入门字典

如何入门学习python...

Python3.9中的字典合并和更新,了解一下

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

python3基础之字典(python中字典的基本操作)

字典和列表一样,也是python内置的一种数据结构。字典的结构如下图:列表用中括号[]把元素包起来,而字典是用大括号{}把元素包起来,只不过字典的每一个元素都包含键和值两部分。键和值是一一对应的...

取消回复欢迎 发表评论:

请填写验证码