前言
由于工作的原因,接触到了hessain,项目需要做hessain和xml之间的报文转换。但是对于hessian是个什么东西一头雾水。于是接下来的时间了解了hessain协议的序列化规则以及hessian协议进行通信的方式。这篇文章是在完成了这个模块之后很长一段时间(大概3个月)才记录的。一来这个时候没什么事,二来当时就一直打算记录下学习的过程,后来搁置了。故本文对hessain协议做一个简单介绍,然后搭建了一个Java版的hessian客户端和服务端,实现了hessian通信。
什么是Hessian
什么是rpc?
RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。RMI是J2EE中标准的RPC服务,RPC的完美封装是的将业务逻辑可以进行分布式部署,将运算密集型的工作进行分流(但请求还是同步的),在使用过程中间封装起实现可以实现在客户端调用的时候完全透明(需要在RMI客户端调用方式进行封装)。
什么是hessian?
Hessian是一个轻量级的,自定义描述的二进制RPC协议。Hessian主要用作面向对象的消息通信。
hessian序列化规则
hessian序列化方式目前有两个版本1.0和2.0,具体可以查看官网http://hessian.caucho.com/doc/hessian-serialization.html。另外我在我的七牛空间上传了hessian协议2.0中文版,有需要的话可以下载,防止官网全英文看不懂。另外hessian官网上提供了各种版本的hessian协议的实现,包括java,c++,c#,Python,.NET,Ruby等,上面其实有比较详细的demo。可以参考,当时我也是参考过的。
Hessian通信案列(java)
环境准备
Eclipse && Tomcat.
资源下载
下载java版的hessian类库: hessian-4.0.37.jar
hessian 服务端
Eclipse中新建Dynamic Web Project
此处可以看到需要选择Target runtime,需要首先安装Tomcat。导入下载的hessian-4.0-37.jar,右键build path->Add to Build path
导入完成如图:开发步骤
hessian服务端的开发涉及到3个部分。定义接口&&接口实现&&web.xml
- 定义接口
新建IBasic.java,随便命名。
1 | package test; |
此处做演示,只定义了一个最简单的hello函数,实际情况可以在此文件中增加你的接口函数。接口函数就是服务端暴露出来的服务,可以为客户服务的实际内容。故此接口文件也需要在客户端的开发中用到。
- 接口实现
新建BasicService.java,随便命名。
1 | package test; |
此文件就是接口函数的具体实现,此处只是针对在IBasic.java中定义好的接口函数。对于小白,简单来说,就是服务端提供了一些服务,或者说暴露了一些服务,也就是接口函数,这些服务供客户端远程调用,就像客户端在本地调用一样,只不过服务端跟客户端的通信采用了一些二进制协议。
- web.xml
服务端实现了上述两个文件,基本就算完成了,不过如果需要发布到tomcat运行,还需要在web.xml配置Servlet.
web.xml:
1 |
|
图中需要注意的就是servlet-name,可以修改成你自己喜欢的名字,至于具体这个web.xml里面各个字段的意义,我其实也不清楚,我对java不了解,我一直从事C++开发。当时自己尝试了很多遍。如果你配置的时候发布到Tomcat启动不了,那么请反复修改下吧。
此处还需要注意需要有个index.jsp这个脚本,如下:
index.jsp:
1 | <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> |
这两个文件的放置的位置也很关键,如果不对,是会出错的。见下图:
4 发布到Tomcat,启动hessian_server
这一步的前提是需要在Eclipse中新建Server并配置好。过程略。毕竟现在不会java的不太多了,我当时为了这小个问题还折腾了好久。
成功后如下:
这里注意到上面的URL: http://localhost:8080/hessian_server,这个地址就是hessian服务端的地址,实际情况将localhost换成服务端所在的IP地址,这个地址客户端需要用到。
hessian服务端到这里就完了。这里我只是用了最简单的方式来设置,实际比较复杂的情况下可以使用spring等,具体我还没研究过。
接下来就是hessian客户端的开发了!!
hessain 客户端
Eclipse中新建Java Project
导入下载的hessian-4.0-37.jar,右键build path->Add to Build path
导入完成如图:开发步骤
hessian客户端的开发涉及到2个部分。定义接口&&客户端主程序
- 定义接口
把上面服务端定义好的接口文件IBasic.java原样复制到工程中。
- 客户端主程序
新建HessianClient.java,随便命名。
1 | package test; |
注意上面的URL地址。
主要步骤定义服务端的地址URL,然后new一个代理工厂HessainProxyFactory,这个代理类工厂负责远程调用。 然后就可以像调用本地函数一样,调用在IBasic.java中定义好的接口函数hello()。
4 启动客户端
项目上右键Run as->Java Application启动客户端。
成功后结果如下:
至此,小结
至此,完成了Hessian 客户端和服务端的通信。现在回过头来看,可能会觉得比较简单。当时还是折腾了好一会呢!! 简单来说,服务端定义并实现服务,发布到Tomcat,客户端新建一个代理,就像调用本地函数那样调用远程的服务端提供的函数,完成通信。
那么Hessian的底层具体是怎么实现的呢?客户端和服务端是怎么完成了序列化,并反序列的?客户端的代理类工厂是怎么实现的?这些我可能会留到另外的博客里分析。
写完了
写这篇文章是回过头来写,大概中间隔了快4个月的时间,为了写这篇博客,里面用到的一些图片,我又从头搭建了一个服务端和客户端,还是碰到了一些小问题,说明过了段时间是会陌生的。最好的时间是做完那个关于Hessain的项目就应该记录下过程,可以节省很多时间。
坚持写博客还是挺困难的,后面有时间打算再写分析下Hessian的源码以及C++版的Hessain,以及做其他项目涉及到的一些东西。
Blog:
rebootcat.com (默认)
email: linuxcode2niki@gmail.com
2016-11-17 于杭州
By 史矛革