`

Hessian远程调用及序列化协议

阅读更多

demo中客户端和服务端的hessian版本都是4.0.7,下面是客户端向服务器端发送的hessian调用及序列化参数的二进制数据,这些数据作为Http Post请求的数据部分传递给了服务器端。

99 2 0 109 0 3 115 97 121 77 116 0 20 104 101 115 115 105 97 110 46 84 114 97 100 101 73 116 101 109    
68 116 111 83 0 6 97 109 111 117 110 116 77 116 0 20 106 97 118 97 46 109 97 116 104 46 66 105 103 68    
101 99 105 109 97 108 83 0 5 115 99 97 108 101 73 0 0 0 0 83 0 6 105 110 116 86 97 108 78 122 122 122  

 

Hessian被称为二进制协议(区别于类似Http的文本协议),是因为hessian调用会被转换为类似上面的字节流,服务器端需要能够解析这个字节流,所以字节流的形成和解析就要遵循hessian协议。特别的hessian同样定义了自己的序列化协议,并没有采用java的序列化机制。与其相比,hessian序列化简单、形成的字节流更加的精简。

下面我们先简单翻译下上面的字节流,大致是这个样子:

'c' 2 0 'm' 0 3 's' 'a' 'y'  'M' 't' 0 20 'h' 'e' 's' 's' 'i' 'a' 'n' '.' 'T' 'r' 'a' 'd' 'e' 'I' 't' 'e' 'm' 'D' 't' 'o'  
'S' 0 6 'a' 'm' 'o' 'u' 'n' 't' 'M' 't' 0 20 'j' 'a' 'v' 'a' '.' 'm' 'a' 't' 'h' '.' 'B' 'i' 'g' 'D' 'e' 'c' 'i' 'm' 'a'  
'l' 'S' 0 5 's' 'c' 'a' 'l' 'e' 'I' 0 0 0 0 'S' 0 6 'i' 'n' 't' 'V' 'a' 'l' 'N' 'z' 'z' 'z'

 

上面只不过是将一些asii字节码翻译为了字符,还是不够清晰,下面就清楚些了,这就是按照Hessian协议进行的一次简单远程调用,意思是此为2.0的rpc,要调用远程service的say方法,方法的参数为hessian.TradeItemDto对象,这个对象有一个字段amount,类型是java.math.BigDecimal类型,amount.scale=0,amount.intVal=null,也就是说amount=0。相当于调用远程service.say(tradeItemDto),而tradeItemDto.amount=0,这里其实是有问题的,demo中传递的是2999,而这里确变为了0,这个问题暂时还没弄清楚。

c 2 0   
    m 0 3 say   
    M t 0 20 hessian.tradeItemDto   
        S 0 6 amount   
            M t 0 20 java.math.BigDecimal   
                S 0 5 scale   
                I 0 0 0 0   
                S 0 6 intVal   
                N   
                z   
        z   
    z  

 

下面是服务器端返回给客户端的字节流

72  2  0 82  10 72  101 108 108 111 32  50  57  57  57  

 

'H' 2  0 'R' 10 'H' 'e' 'l' 'l' 'o' ' ' '2' '9' '9' '9'  

 

翻译一下,意思是说,hessian协议是2.0版本,这是一个对远程调用的Reply,返回的是一个长度为10的字符串"Hello 2999"。包括上面的字节流和这里其实demo中返回的是"H 2 0 R 7 Hello 0",因为客户端传过来的就是tradeItemDto.amount=0,下面结果是经过我修改的,是应该返回的结果。

H 2 0   
R    
10 Hello 2999  

 

在demo里面遇到一个问题,现象是参数tradeItemDto.amount是2999,事实序列化成的字节流里是0, 那个问题貌似是因为序列化出了问题,这个还要在研究下在后面在谈这个问题。

HessianProxyFactory里可以设置一些标志,比如是否支持方法重载setOverloadEnabled,设置读超时setReadTimeout,设置连接超时setConnectTimeout,设置Hessian 2.0请求setHessian2Request,设置Hessian 2.0 Reply setHessian2Reply,默认是1.0请求,2.0 Reply。上面的Demo中就是1.0请求,2.0Reply

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/huoyijie/archive/2010/09/26/5907169.aspx

分享到:
评论

相关推荐

    java+hessian 远程调用

    Java Hessian远程调用是一种高效的、轻量级的RPC(Remote Procedure Call)解决方案,它允许Java应用程序通过网络进行跨语言的通信。Hessian是BEA Systems开发的一种二进制Web服务协议,它提供了序列化和远程方法...

    hessian学习基础篇——序列化和反序列化

    本文将深入探讨Hessian框架的基础知识,它是一个高效的二进制序列化协议,广泛应用于Java和.NET之间跨语言通信。通过学习Hessian,我们可以更有效地处理数据传输,提高应用性能。 首先,让我们理解什么是序列化。...

    Hessian远程调用框架学习一

    Hessian远程调用框架是基于Java的轻量级RPC(Remote Procedure Call)解决方案,它允许开发者在分布式系统中实现高效、便捷的跨网络对象方法调用。本教程将引导你入门Hessian,通过一个简单的JAVA demo来理解其工作...

    hessian实现远程调用

    首先,Hessian基于HTTP协议,使用二进制序列化来减少数据传输量,从而提高通信效率。它支持Java、C++等多种语言,使得跨语言的远程调用成为可能。Hessian的核心思想是将Java对象转换成二进制流,通过网络发送,然后...

    S25-hessian反序列化1

    Hessian是一种二进制序列化协议,旨在提高远程过程调用(RPC)的效率。与原生Java序列化相比,Hessian序列化具有更快的速度和更小的数据传输量。 在Java中,通常只有实现了`java.io.Serializable`接口的类才能被序列...

    Hessian 的字段序列化小记

    Hessian是一种二进制的序列化协议,由Caucho公司开发,它旨在提供高效、轻量级的数据交换方式。本文将围绕"Hessian的字段序列化小记"这一主题,深入探讨Hessian的工作原理、序列化过程以及其在实际应用中的价值。 ...

    Hessian远程调用RPC最简单demo

    本教程将详细介绍"Hessian远程调用RPC最简单demo",包括服务器端服务发布和客户端服务调用的实现,以及所需资源。 首先,我们来看一下`hessian-4.0.7.jar`这个文件。这是Hessian库的核心组件,包含了实现Hessian...

    Hessian 2.0序列化协议规范.docx

    Hessian 2.0的目标是提供一种轻量级、易于实现且高效的序列化协议,适用于远程过程调用(RPC)和数据交换。它采用了二进制格式,相比基于文本的序列化协议(如JSON或XML),二进制格式在数据体积和解析速度上都有...

    hessian序列化规范

    Hessian,作为一种高效的二进制序列化协议,由Caucho公司开发,广泛应用于Java、.NET等平台,尤其在远程方法调用(RPC)中表现出色。本文将深入探讨Hessian序列化规范,旨在帮助开发者更好地理解和应用这一技术。 ...

    hessian框架应用,实现远程调用,分布式开发

    Hessian支持序列化Java对象,使得远程调用如同本地调用一样便捷,极大地提高了开发效率。 一、Hessian框架的核心特性: 1. **二进制协议**:Hessian采用高效的二进制协议,与基于文本的HTTP协议相比,数据传输量更...

    spring整合hessian进行远程通讯

    当服务端和客户端升级时,需要考虑Hessian版本的兼容性问题,因为不同的Hessian版本可能支持的序列化协议有所不同。 总之,通过Spring整合Hessian,我们可以快速地构建起一套高效的分布式系统,实现远程服务调用。...

    hession远程调用分享

    《Hessian远程调用技术详解》 在分布式系统中,远程调用是常见的通信方式,它使得服务可以跨越网络边界,实现组件之间的交互。Hessian,由Caucho公司开发,是一种高效的二进制RPC(Remote Procedure Call)协议,常...

    34_dubbo都支持哪些通信协议以及序列化协议?.zip

    在实现远程服务调用时,通信协议和序列化协议是至关重要的部分,它们直接影响到服务的性能和兼容性。 首先,让我们了解Dubbo支持的通信协议: 1. **Dubbo Protocol**:Dubbo默认的通信协议,基于TCP长连接的高性能...

    Hessian Binary Web Service Protocol远程接口调用入门Demo

    Hessian会自动处理网络传输、序列化和反序列化的过程。 在提供的压缩包文件“Hessian”中,可能包含了服务端和客户端的示例代码。服务端代码展示了如何定义和实现Hessian服务,以及如何配置和启动服务。客户端代码...

    远程调用服务框架

    Spring通过HessianProtocolFactoryBean实现了Hessian服务的消费和发布,使得远程调用更加高效便捷。 4. **HTTP Invoker**:HTTP Invoker是Spring为Java对象提供的另一种远程调用方案,它基于HTTP协议,但提供了类似...

    spring远程调用简单实例

    Spring支持多种远程调用协议,如RMI(Remote Method Invocation)、Hessian、 Burlap以及HTTP Invoker等。这些协议允许我们跨越网络边界,像调用本地方法一样调用远程服务。 在本实例中,我们关注的是HTTP Invoker...

    Hessian远程操作

    9. **性能优化**:Hessian通过减少网络开销和优化序列化过程,提高了远程调用的性能。但在大型系统中,还需要根据具体情况进行性能测试和调优。 10. **版本兼容性**:随着Hessian协议的更新,可能存在版本兼容性...

    Nacos JRaft Hessian 反序列化 RCE 分析.pdf

    Hessian 是一种轻量级的远程过程调用 (RPC) 协议,用于简化 Java 对象在网络中的传输。 #### 二、问题概述 在 Nacos JRaft 中,存在一个与 Hessian 相关的反序列化漏洞,可能导致远程代码执行 (RCE)。这一安全问题...

    Hessian调用

    Hessian协议是一种序列化协议,它将Java对象转换为二进制流,从而在网络上传输,到达目的地后再反序列化回原来的对象。这种二进制格式比XML或JSON更紧凑,因此在网络传输中效率更高。Hessian不仅支持基本数据类型,...

    hessian-4.0.33.jar

    Hessian是一种高效的二进制RPC(Remote Procedure Call)协议,由Caucho Technology开发,旨在提供轻量级、高效的远程调用服务。在这个专题中,我们将以hessian-4.0.33.jar为例,详细探讨Hessian框架的核心特性和...

Global site tag (gtag.js) - Google Analytics