Hessian远程调用及序列化协议
2011-11-23 10:27
253 查看
demo中客户端和服务端的hessian版本都是4.0.7,下面是客户端向服务器端发送的hessian调用及序列化参数的二进制数据,这些数据作为Http Post请求的数据部分传递给了服务器端。
Java代码
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序列化简单、形成的字节流更加的精简。
下面我们先简单翻译下上面的字节流,大致是这个样子:
Java代码
'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,这个问题暂时还没弄清楚。
Java代码
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
下面是服务器端返回给客户端的字节流
Java代码
72 2 0 82 10 72 101 108 108 111 32 50 57 57 57
Java代码
'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,下面结果是经过我修改的,是应该返回的结果。
Java代码
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
Java代码
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
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序列化简单、形成的字节流更加的精简。
下面我们先简单翻译下上面的字节流,大致是这个样子:
Java代码
'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'
'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,这个问题暂时还没弄清楚。
Java代码
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
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
下面是服务器端返回给客户端的字节流
Java代码
72 2 0 82 10 72 101 108 108 111 32 50 57 57 57
72 2 0 82 10 72 101 108 108 111 32 50 57 57 57
Java代码
'H' 2 0 'R' 10 'H' 'e' 'l' 'l' 'o' ' ' '2' '9' '9' '9'
'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,下面结果是经过我修改的,是应该返回的结果。
Java代码
H 2 0 R 10 Hello 2999
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
相关文章推荐
- Hessian远程调用及序列化协议
- 基于dubbo的hessian协议远程调用实例
- [转载] 基于Dubbo的Hessian协议实现远程调用
- dubbo_实现Hessian的远程调用协议
- Hessian——轻量级的二进制协议远程调用实现方案
- 基于Dubbo的Hessian协议实现远程调用
- 基于Dubbo的Hessian协议实现远程调用
- Spring结合Hessian协议远程调用方法名不能重载
- Spring的Hessian,Burlap,HttpInvoker远程调用
- IOS结合hessian实现远程调用
- 几种序列化协议(protobuf,xstream,jackjson,jdk,hessian)相关数据对比
- hessian远程调用及spring中使用hessian
- 几种序列化协议(protobuf,xstream,jackjson,jdk,hessian)相关数据对比
- 几种序列化协议(protobuf,xstream,jackjson,jdk,hessian)相关数据对比
- JSON-RPC轻量级远程调用协议介绍及使用
- Hessian 2.0序列化协议规范
- j2ee中常用的五种远程调用协议
- Java 远程调用之Hessian简例
- 远程调用原理与对比RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB
- Spring + Hessian 实现轻量级分布式远程调用【包含rmi方式重构】