Hessian总结
一、简介:
Hessian是一个基于Binary-RPC 实现的远程通讯library,基于 Http 协议进行传输。通过其自定义的串行化机制将请求信息进行序列化,产生二进制流。响应端根据 Hessian 提供的 API 来接收请求,根据其私有的串行化机制来将请求信息进行反序列化,传递给使用者时已是相应的请求信息对象了。处理完毕后直接返回,hessian 将结果对象进行序列化,传输至调用端。
一次完整的调用如下图所示:

二、Demo:
1. 服务端:
l 首先建立web工程,引入Hessian的jar包;
l 接着定义接口:
|
public interface HelloService { public String sayHello(String name); } |
l 然后实现接口:
|
public class HelloServiceImpl extends HessianServlet implements HelloService { @Override public String sayHello(String name) { return "Hello :"+name; } } |
2.客户端:
|
public static void main(String[] args) throws MalformedURLException { String url="http://localhost:8080/myserver/hello"; HessianProxyFactory hessianProxyFactory = new HessianProxyFactory(); // 创建接口代理程序 HelloService proxy = (HelloService) hessianProxyFactory.create(HelloService.class, url); String result = proxy.sayHello("test"); System.out.println(result); } |
三、客户端流程分析:

1、客户端首先通过HessianProxyFactory创建HessianProxy对象,也就是使用动态代理调用服务的方法的代理对象;
2、在HessianProxy对象中缓存Method和MethodName的hash表,invoke方法中首先根据Method在hash表查找对应的MethodName,如果找到则直接使用缓存,如果未找到则根据Method读出MethodName,并缓存到hash表中;
3、HessianProxy.invoke方法中主要调用sendRequest调用远程对象,首先通过addRequestHeaders添加Http协议头信息,获取远程服务器的HessianConnection对象,然后通过AbstractHessianOutput.Call将调用方法和参数序列化为二进制,最后通过HessianConnection. sendRequest将调用信息发送到远端服务器;
4、AbstractHessianOutput.Call序列化调用信息时,startCall在二进制流里面写入起始标记“c”、版本信息以及长度等信息,然后调用Serializer对象将调用方法和参数进行序列化,最后通过写入结束标记“z”完成二进制流的序列化;
四、服务器端流程分析:

1、HessianSkeleton是hessian server端的核心类,从输入流中返序列化出客户端调用的方法和参数,对服务端服务进行调用,然后把处理结果返回给客户端;
2、HessianSkeleton.invoke首先调用AbstractHessianInput.readObject读出调用方法名和参数信息,并根据这个信息从service中查找到对应的Method对象;
|
String methodName = in.readMethod(); int argLength = in.readMethodArgLength(); Method method; method = getMethod(methodName + "__" + argLength); if (method == null) method = getMethod(methodName); |
其中getMethod是从一个_methodMap的hash表中查找Method对象,而_methodMap表在服务类对象的构造函数中就已经完成了Method对象和方法名的映射:
|
protected AbstractSkeleton(Class apiClass) { _apiClass = apiClass; Method []methodList = apiClass.getMethods(); for (int i = 0; i < methodList.length; i++) { Method method = methodList[i]; if (_methodMap.get(method.getName()) == null) _methodMap.put(method.getName(), methodList[i]); } } |
3、接下来读取参数值是调用的AbstractHessianInput.readObject读取的,而这个读取又是调用的Deserializer对象的readObject读取的,其读取方法(反序列化)与客户端的序列化格式是一一对应的;
4、将调用方法名和参数值都反序列化出来后,接下来就通过动态代理调用Service服务的对应方法,将其返回值使用writeReply进行序列化后返回给调用客户端:
|
public void writeReply(Object o) throws { startReply(); writeObject(o); completeReply(); } |
其中的startReply和completeReply分别在二进制流里面写入起始标记和结束标记,writeObject将返回值序列化到二进制流里面;
Hessian总结的更多相关文章
- spring remoting源码分析--Hessian分析
1. Caucho 1.1 概况 spring-remoting代码的情况如下: 本节近分析caucho模块. 1.2 分类 其中以hession为例,Hessian远程服务调用过程: Hessian ...
- spring与hessian整合例
spring与hessian的简单应用实现例: 开发环境:window7 64,jdk8,tomcat8,spring4.2.5,hessian4.0 开发语言:java hessianServer端 ...
- 十五分钟学会用Hessian
了解Hessian Hessian是远程调用的一种技术,和WebService类似,但不同的是较WebService而言,它更轻量级,更简单,更快速.关于Hessian更详细全面的介绍可以查看http ...
- Spring远程调用技术<2>-Hessian和Burlap
上篇谈到RMI技术,加上Spring的封装,用起来很方便,但也有一些限制 这里的Hessian和Burlap解决了上篇提到的限制,因为他们是基于http的轻量级远程服务. Hessian,和RMI一样 ...
- Xml,Json,Hessian,Protocol Buffers序列化对比
简介 这篇博客主要对Xml,Json,Hessian,Protocol Buffers的序列化和反序列化性能进行对比,Xml和Json的基本概念就不说了. Hessian:Hessian是一个轻量级的 ...
- java和c#使用hessian通信
介绍 hessian主页:http://hessian.caucho.com/ 一个简单的例子学习hessian服务:服务端为Java,客户端为C#. 先要准备好C#和Java的第三方类库:http: ...
- Hessian怎样实现远程调用
1.Spring中除了提供HTTP调用器方式的远程调用,还对第三方的远程调用实现提供了支持,其中提供了对Hessian的支持. Hessian是由Caocho公司发布的一个轻量级的二进制协议远程调用实 ...
- com.caucho.hessian.io.HessianProtocolException: is unknown code 解决方案
问题: Cannot access Hessian remote service at [http://....../remote/syllabusService]; nested exception ...
- Hessian最佳实践
前言:本文主要介绍‘独立的Hessian技术’与‘结合Spring技术’的两种Hessian接口开发模式及代码示例. 一.独立的Hessian技术开发步骤 Hessian-Java服务器端必须具备以下 ...
- RPC hessian简单案例
RPC(Remote procedure call) 远程服务调用. dubbox就是RPC框架,hessian是简单的RPC实现. 首先需要有接口及其实现类: 接口. public interfac ...
随机推荐
- DevExpress v18.1新版亮点——DevExtreme篇(一)
用户界面套包DevExpress v18.1日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExtreme JavaScript Controls v18.1 的新功能 ...
- android 广播 接收短信
; i < messages.length; i++) { SmsMessage ms = SmsMessage.createFromPdu((byte[])pdus[i]); String f ...
- SharePoint Framework 企业向导(一)
博客地址:http://blog.csdn.net/FoxDave 简介 SharePoint Framework(SPFx)是一个新的SharePoint用户接口扩展的开发模型,它用来补充现有的 ...
- 《深入分析Java Web技术内幕》读书笔记 - 第1章 深入Web请求过程
第1章 深入Web请求过程 1 1.1 B/S网络架构概述 2 基于统一的应用层协议HTTP来交互数据. 1.2 如何发起一个请求 4 HTTP连接本质是建立Socket连接.请求实现方式:工具包如H ...
- 20165214 预备作业3 Linux安装及学习
一.VirtualBox和Ubuntu的安装 点进VirtualBox的官网后,不知道为什么,我只看到了5.2.6版本...又看到同学反映说5.2.7版本会出现问题,我想可能是工作人员正在补5.2.7 ...
- DRF-Rest_Framework 学习文档
序列化器(serializer) 定义Serializer 1. 定义方法 Django REST framework中的Serializer使用类来定义,须继承自rest_framework.ser ...
- vue mapbox 地图 demo
执行以下命令: npm install --save mapbox-gl// cnpm install --save mapbox-gl <template> <div style= ...
- awr脚本使用dump导出导入
实际工作中,存在这么一种场景.客户现场分析问题,无法立即得出结论,且无法远程服务器,因此对于服务器中的awr信息,如何提取是一个问题,oracle有脚本可以对服务器中以db为单位导出awr基表的dum ...
- Java中的this关键字老生常谈
一.this的由来 this关键字就是获得调用当前方法对象的引用. 二.注意点 this关键字只能出现在方法内部,完成对调用该方法的对象的引用. 三.this关键字的三个用处 1.最主要的用处: 获 ...
- Python之路PythonNet,第三篇,网络3
pythonnet 网络3 udp 通信 recvfrom sendtofork 多进程并发threading 多线程并发socketserver 系统模块 套接字的属性 setsockopt g ...