个人博客:戳我,戳我
许下的承诺
前两篇博客Hessian通信案例(java)和Hessian源码分析(java)介绍了Java版的hessian的使用以及源码分析。当时也说过打算写一下C++版的hessian的使用和源码分析,现在就是兑现承诺的时候了。其实我项目中实际用到的是C++版的hessian,java版的hessian是我最初接触用来理解hessian,并进行联调测试的部分。
hessian的官网上也提供了C++版的hessian的实现。只不过当时在网上找到的说法是hessiancpp的活跃度比较低,而且编译出问题很多,但是还是决定自己亲自一试,毕竟”绝知此事要躬行”嘛,嘿嘿!当然也有其他版本的C++实现,比如hessianorb项目。
Hessiancpp编译
现在是回过头来写,故早先编译碰到的问题我已经没办法复现,此处就只记录正确的编译步骤和方法。
下载hessiancpp
到官网下载源码包:https://sourceforge.net/projects/hessiancpp/,我自己当时的版本是hessiancpp-hessaincpp-1.1.0.tar.gz。
解压编译
解压上面下载的tar.gz压缩包
tar zxvf hessiancpp-hessaincpp-1.1.0.tar.gz
然后进入顶层目录hessiancpp:
cd hessaincpp
你可以先查看此目录下的Makefile文件,然后试着执行:
make all
结果,不出所料,编译出错,错误如下:
In file included from hessian_proxy.cpp:19:0:
hessian_proxy.h:31:19: 致命错误:ssl++.h:没有那个文件或目录
编译中断。
make: * [hessian_proxy.o] 错误 1
可见缺少了一个叫做ssl++.h的头文件,我们再仔细查看Makefile文件,可以看到第一行代码是:
SSLPP=../sslpp
显然需要另外一个库。这个库就是提供http代理的功能。网上有人碰到这个问题后,选择了libcurl重写一个http代理,据说还可行。
言归正传,我们需要一个叫做sslpp的库。
下载hessian-sslpp
去github下载: https://github.com/ksturner/hessian/tree/master/sslpp
常规操作,解压,然后进入顶层目录,然后查看Makefile文件,然后尝试执行make all编译。果然又出错了。
查看INSTALL文件:
SSLPP was developed on a Fedora Core 2 x86_64 system, using
- GCC 3.3.3
- OpenSSL 0.9.7a
- BOOST 1.31.0
- shared library
可以看到编译SSLPP需要的依赖。我碰到的编译错误是没有安装BOOST库。那么就去安装吧:
yum install boost boost-devel boost-doc
完事之后再试着执行make all ,make install看看。如果没有错误,那么基本就是可以了,如果碰到了错误,那么没办法,只能一步步解决。
这里主要是需要编译生成的libsslpp.so这个动态库。
继续编译hessiancpp
回到之前对hessiancpp的编译,修改下Makefile文件中SSLPP这个宏的值,根据sslpp的编译修改。然后执行:
make all
正常情况就不会有问题了,编译成功。在当前目录下生成了一个libhessian.so和一个main可执行程序和main_dyn可执行程序。
大功告成!!!
使用hessiancpp
首先要明白,hessiancpp只是实现了hessian的客户端,具体就是实现了hessian的序列化和反序列算法以及使用sslpp作为一个http代理客户端。故如果要使用hessiancpp,还需要配合一个hessian服务端,这里就用之前博文中介绍过的java 版hessian server作为服务端。
启动hessian server
假设服务端提供了两个接口函数,具体请看下图:
函数功能都是返回”Hello, world,my name is nick!”。
需要注意的是,此时这个服务端的地址为:* http://[IP]:8080/hessian_server/ServerMachineTest *
然后,启动服务端。
修改客户端代码
回到hessiancpp目录下,修改main.cpp。主要修改的代码是:
......
cout