读书人

关于Hessian的C++客户端与java服务端通

发布时间: 2012-12-25 16:18:28 作者: rapoo

关于Hessian的C++客户端与java服务端通信
之前一篇文章里提到了通过扩展hessian的java客户端源码来实现client与server通信过程中的session机制。
这样一来,使用hessian做java客户端的确没有太多问题了,也意味着android版本在通信方面问题解决了;随之而来的是iOS版本,大家都知道,iphone开发所使用的语言是Object-C,但实质是C++,所以我的项目中,首先还要保证Hessian的C++版本能够与服务端正常通信,于是用C++版本的client api做简单的测试后发现,C++版本调用服务端后,对于复杂数据结构情况,C++程序将其解包成一个Hessian的C++版本封装好的Map结构,也就是说,自定义类型的数据结构均以Map的形态在C++中存在,这与我最初的RPC设想还是有差别的,如果客户端的开发人员使用Map进行逻辑开发,就以为着,当接口传输结构需要修改的时候,需要client开发人员对源代码进行反复修改,且容易将一些bug隐藏。

既然问题已经明确,那随之而来的就是寻求解决方案了,C++版本之所以不支持自定义对象结构在client的逻辑开发中使用,一个最主要的原因是因为C++不像java那样有反射机制(当然Objective-C中可能存在,但我们还是需要C++版本)。最终我的解决方案是:
1、当服务定义逻辑接口以及接口中所使用的参数及返回值后,使用ant进行编译;
2、ant编译的过程中,调用已经为C++写好的模板(velocity或freemarker等)生成C++接口及传输类的代码;
3、将新的C++代码上传版本控制器;
4、客户端更新版本后可使用。
这样,C++客户端也有了真正意义的如同本地调用一样的RPC,且支持复杂对象结构的使用。

当然以上的改造对C++版本的hessian客户端源码进行了几行的修改,大部分工作已扩展为主。

以上只说明了方案,未将C++代码贴出,C++部分为公司其他人开发。在这里我只希望对有相同需求的朋友提供一个已经被验证过的解决方案,如果谁有更好的解决方式欢迎指教。 1 楼 zhongji 2011-06-09 请教下为啥我的c++ client访问老是报这个错:
严重: Servlet.service() for servlet remoting threw exception
java.io.IOException: expected 'c' in hessian input at -1
at org.springframework.remoting.caucho.Hessian2SkeletonInvoker.invoke(Hessian2SkeletonInvoker.java:77)
at org.springframework.remoting.caucho.HessianExporter.invoke(HessianExporter.java:142)
at org.springframework.remoting.caucho.HessianServiceExporter.handleRequest(HessianServiceExporter.java:70)
at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:49)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571) 2 楼 hhb19900618 2012-02-03 兄弟 那意思是目前ios不能使用hessian去解析吗?

读书人网 >C++

热点推荐