【hessian】一 hessian 基本介绍

【hessian】一 hessian 基本介绍Hessian 介绍 Hessian 是一个轻量级的 remotingonht 工具 使用简单的方法提供了 RMI 的功能 相比 WebService Hessian 更简单 快捷 采用的是二进制 RPC 协议 因为采用的是二进制协议 所以它很适合于发送二进制数据 在进行基于 Hessian 的项目开发时 应当注意以下几点 JAVA 服务器端必须具备以下几点 包含 Hessian 的 jar 包设

Hessian介绍

Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能. 相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。

这里写图片描述

在进行基于Hessian的项目开发时,应当注意以下几点:

JAVA服务器端必须具备以下几点:

  1. 包含Hessian的jar包
  2. 设计一个接口,用来给客户端调用
  3. 实现该接口的功能
  4. 配置web.xml,配好相应的servlet
  5. 对象必须实现Serializable 接口
  6. 对于复杂对像可以使用Map的方法传递

java客户端包含

  1. Hessian.jar的包
  2. ·具有和服务器端结构一样的接口。包括命名空间都最好一样
  3. 利用HessianProxyFactory调用远程接口。

Hessian原理分析

原文网址: https://blog.csdn.net/zhtang0526/article/details/

一. 远程通讯协议的基本原理

网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络 IO 来实现,其中传输协议比较出名的有 http 、 tcp 、 udp 等等, http 、 tcp 、 udp 都是在基于 Socket 概念上为某类应用场景而扩展出的传输协议,网络 IO ,主要有 bio 、 nio 、 aio 三种方式,所有的分布式应用通讯都基于这个原理而实现,只是为了应用的易用,各种语言通常都会提供一些更为贴近应用易用的应用层协议。

二. 应用级协议Binary-RPC

问题总结:

1 、传输的标准格式是?

标准格式的二进制文件。

2 、怎么样将请求转化为传输的流?

将二进制格式文件转化为流。

3 、怎么接收和处理流?

通过监听的端口获取到请求的流,转化为二进制文件,根据协议获取请求的信息,进行处理并将结果写入 XML 中返回。

4 、传输协议是?

Http 【http协议底层是包装tcp协议】

三. Hessian 是一种实现远程通讯的 library

Hessian 是由 caucho 提供的一个基于 binary-RPC 实现的远程通讯 library 。

1 、是基于什么协议实现的?

基于 Binary-RPC 协议实现。

2 、怎么发起请求?

需通过 Hessian 本身提供的 API 来发起请求。

3 、怎么将请求转化为符合协议的格式的?

Hessian 通过其自定义的串行化机制将请求信息进行序列化,产生二进制流。

4 、使用什么传输协议传输?

Hessian 基于 Http (底层tcp)协议进行传输。

5 、响应端基于什么机制来接收请求?

响应端根据 Hessian 提供的 API 来接收请求。

6 、怎么将流还原为传输格式的?

Hessian 根据其私有的串行化机制来将请求信息进行反序列化,传递给使用者时已是相应的请求信息对象了。

7 、处理完毕后怎么回应?

处理完毕后直接返回, hessian 将结果对象进行序列化,传输至调用端。

四. Hessian源码分析

以hessian和spring dm server整合环境为例。

1. 客户端发起请求

客户端系统启动时:
根据serviceUrl和serviceInterface创建代理。
HessianProxyFactoryBean类
HessianClientInterceptor类
createHessianProxy(HessianProxyFactory proxyFactory)
HessianProxyFactory类
public Object create(Class api, String urlName)





客户端调用hessian服务时:
HessianProxy类的invoke(Object proxy, Method method, Object []args)方法
String methodName = method.getName();//取得方法名
Object value = args[0]; //取得传入参数
conn = sendRequest(mangleName, args); //通过该方法和服务器端取得连接
httpConn = (HttpURLConnection) conn;
code = httpConn.getResponseCode(); //发出请求
//等待服务器端返回相应…………
is = conn.getInputStream();
Object value = in.readObject(method.getReturnType()); //取得返回值
HessianProxy类的URLConnection sendRequest(String methodName, Object []args)方法:
URLConnection conn = _factory.openConnection(_url); //创建URLConnection
OutputStream os = conn.getOutputStream();
AbstractHessianOutput out = _factory.getHessianOutput(os); //封装为hessian自己的输入输出API
out.call(methodName, args);
return conn;














2. 服务器端接收请求并处理请求

总结:由上面源码分析可知,客户端发起请求和服务器端接收处理请求都是通过hessian自己的API。输入输出流都要封装为hessian自己的Hessian2Input和Hessian2Output,接下来一节我们将去了解hessian自己封装的输入输出到底做了些什么!

五. Hessian的序列化和反序列化实现

hessian源码中com.caucho.hessian.io这个包是hessian实现序列化与反序列化的核心包。其中AbstractSerializerFactory,AbstractHessianOutput,AbstractSerializer,AbstractHessianInput,AbstractDeserializer是hessian实现序列化和反序列化的核心结构代码。

1. AbstractSerializerFactory,它有2个抽象方法:
根据类来决定用哪种序列化工具类
abstract public Serializer getSerializer(Class cl) throws HessianProtocolException;
根据类来决定用哪种反序列化工具类
abstract public Deserializer getDeserializer(Class cl) throws HessianProtocolException;
2. SerializerFactory继承AbstractSerializerFactory。
在SerializerFactory有很多静态map用来存放类与序列化和反序列化工具类的映射,这样如果已经用过的序列化工具就可以直接拿出来用,不必再重新实例化工具类。
在SerializerFactory中,实现了抽象类的getSerializer方法,根据不同的需要被序列化的类来获得不同的序列化工具,一共有 17种序列化工具,hessian为不同的类型的java对象实现了不同的序列化工具,默认的序列化工具是JavaSerializer。
在SerializerFactory中,也实现了抽象类的getDeserializer方法,根据不同的需要被反序列化的类来获得不同的反序列化工具,默认的反序列化工具类是JavaDeserializer。
3. HessianOutput继承AbstractHessianOutput成为序列化输出流的一种实现。
它会实现很多方法,用来做流输出。
需要注意的是方法,它会先调用serializerFactory根据类来获得serializer序列化工具类
public void writeObject(Object object)
throws IOException
{
if (object == null) {
writeNull();
return;
}
Serializer serializer;
serializer = _serializerFactory.getSerializer(object.getClass());
serializer.writeObject(object, this);
}
4. 现在我们来看看AbstractSerializer。
其writeObject是必须在子类实现的方法,AbstractSerializer有17 种子类实现,hessian根据不同的java对象类型来实现了不同的序列化工具类,其中默认的是JavaSerializer。
而JavaSerializer的writeObject方法的实现,遍历java对象的数据成员,根据数据成员的类型来获得各自的FieldSerializer,一共有6中默认的FieldSerializer。
拿默认的FieldSerializer举例,还是调用AbstractHessianOutput的子类来writeObject,这个时候,肯定能找到相应的Serializer来做序列化
同理可以反推出hessian的反序列化机制。SerializerFactory可以根据需要被反序列化的类来获得反序列化工具类来做反序列化操作。


























总结:得益于hessian序列号和反序列化的实现机制,hessian序列化的速度很快,而且序列化后的字节数也较其他技术少。

六、hessian的RPC调用10个步骤(客户端调用服务端)

如图:
这里写图片描述

1.调用客户端句柄;执行传送参数
2.调用本地系统内核发送网络消息
3.消息传送到远程主机
4.服务器句柄得到消息并取得参数
5.执行远程过程
6.执行的过程将结果返回服务器句柄
7.服务器句柄返回结果,调用远程系统内核
8.消息传回本地主机
9.客户句柄由内核接收消息
10.客户接收句柄返回的数据








版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/216720.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午11:13
下一篇 2026年3月18日 上午11:13


相关推荐

  • c语言入门教程–-4运算符

    c语言入门教程–-4运算符

    2021年3月12日
    226
  • JS获取当前时间方法

    JS获取当前时间方法1 获取时间 vardate newDate varyear date getFullYear 返回的是年份 varmonth date getMonth 1 返回的月份上个月的月份 记得 1 才是当月 vardates date getDate 返回的是几号 varday date getDay 周一返回的是 1 周六是 6 但是周日是 0

    2026年3月26日
    2
  • clientWidth offsetWidth innerWidth 区别(窗口尺寸 汇总)「建议收藏」

    clientWidth offsetWidth innerWidth 区别(窗口尺寸 汇总)「建议收藏」原文链接:http://www.cnblogs.com/youxin/archive/2012/09/21/2697514.htmlscrollWidth 是对象的实际内容的宽,不包边线宽度,会随对象中内容的多少改变(内容多了可能会改变对象的实际宽度)。 clientWidth 是对象可见的宽度,不包滚动条等边线,会随窗口的显示大小改变。 offsetWidth 是对象的可

    2022年7月22日
    15
  • Java:Map转List (用stream实现)

    Java:Map转List (用stream实现)例子 Map Integer String mapDemo newHashMap lt gt map put 10 apple map put 20 orange map put 30 banana map put 40 watermelon map put 50 dragonfruit 一 Map Integer Object 转 List amp l Integer Object Integer String

    2026年3月16日
    1
  • 熊猫烧香病毒分析报告

    熊猫烧香病毒分析报告1.样本概况1.1样本信息(1)病毒名称:spo0lsv.exe(2)所属家族:熊猫烧香(3)MD5值:B8F8E75C9E77743A61BBEA9CCBCFFD5D(4)SHA1值:188FC8FC580C0EA4BF8A8900A3D36471823C8923(5)CRC32:E63D45D3(6)病毒行为:复制自身到系统目录下设置文件属性为隐藏,并且让…

    2025年8月5日
    6
  • QT多线程编程详解

    QT多线程编程详解一 线程基础 1 GUI 线程与工作线程每个程序启动后拥有的第一个线程称为主线程 即 GUI 线程 QT 中所有的组件类和几个相关的类只能工作在 GUI 线程 不能工作在次线程 次线程即工作线程 主要负责处理 GUI 线程卸下的工作 2 数据的同步访问每个线程都有自己的栈 因此每个线程都要自己的调用历史和本地变量 线程共享相同的地址空间 二 QT 多线程简介 QT 通过三种形式提供了对线程

    2026年3月20日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号