前言
被我忘掉的 Hessian 反序列化 —— C1oudfL0w0 版(
参考:
https://blog.potatowo.top/2024/11/12/Java%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E4%B9%8BHessian/
https://zhuanlan.zhihu.com/p/621596752
https://github.com/oldersheep/simple-hessian-rpc
RPC 协议
此事在计算机操作系统中亦有记载
RPC 全称为 Remote Procedure Call(远程过程调用),它允许一个计算机程序在另一台计算机上执行代码
类似于之前的 RMI,都是远程调用服务,它们的不同之处就是 RPC 通过标准的二进制格式来定义请求的信息,这样跨平台和系统更加方便
实现:
- 定义接口。客户端和服务端需要共同定义一套接口,描述函数的输入参数和返回值。
- 生成代理代码。客户端需要生成一个代理,它可以将函数调用转换成网络消息,并将结果返回给客户端。
- 序列化和反序列化。客户端和服务端之间需要将数据序列化成网络字节流,以便进行传输。收到数据后,需要将其反序列化成可读的数据格式。
- 网络传输。客户端和服务端之间需要进行网络传输,以便进行数据交换。
- 调用远程函数。客户端通过代理调用服务端的函数,服务端执行该函数并返回结果。
- 返回结果。服务端将执行结果序列化后发送给客户端,客户端将其反序列化成可读的数据格式。
相应的通信过程:
- 客户端发起请求,并按照RPC协议格式填充信息
- 填充完毕后将二进制格式文件转化为流,通过传输协议进行传输
- 服务端接收到流后,将其转换为二进制格式文件,并按照RPC协议格式获取请求的信息并进行处理
- 处理完毕后将结果按照RPC协议格式写入二进制格式文件中并返回
Hessian 协议
Hessian 是一个基于 RPC 的高性能二进制远程传输协议,官方对 Java、Python、C++ 等语言都进行了实现,Hessian 一般在Web服务中使用。
在 Java 里它的使用方法很简单,它定义远程对象,并通过二进制的格式进行传输
<dependency>
<groupId>com.caucho</groupId>
<artifactId>hessian</artifactId>
<version>4.0.63</version>
</dependency>
类似于 RMI 的形式,Hessian 需要服务端和消费端通过接口相关联,服务端实现接口,当然数据在网络传输之后要进行还原就需要序列号
写一个 demo: