加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

WebService另一种轻量级实现—Hessian 学习笔记

发布时间:2020-12-16 22:20:29 所属栏目:安全 来源:网络整理
导读:最近研究,得知他们在使用一种叫做Hessian的WebService实现方式实现远程方法调用,是轻量级的,不依赖JavaEE容器,同时也是二进制数据格式传输,效率比SOAP的XML方式要高。感觉像是RESTFUL方式类似,好奇之下到网上查阅相关资料,总结如下: 简介 ???????Hes

最近研究,得知他们在使用一种叫做Hessian的WebService实现方式实现远程方法调用,是轻量级的,不依赖JavaEE容器,同时也是二进制数据格式传输,效率比SOAP的XML方式要高。感觉像是RESTFUL方式类似,好奇之下到网上查阅相关资料,总结如下:

  1. 简介

???????Hessian是由caucho提供的一个基于binary-RPC实现的远程通讯library。

  1、是基于什么协议实现的?

  ?????????基于Binary-RPC协议实现。

  2、怎么发起请求?

  ?????????需通过Hessian本身提供的API来发起请求。

  3、怎么将请求转化为符合协议的格式的?

  ?????????Hessian通过其自定义的串行化机制将请求信息进行序列化,产生二进制流。

  4、使用什么传输协议传输?

  ?????????Hessian基于Http协议进行传输。

  5、响应端基于什么机制来接收请求?

  ?????????响应端根据Hessian提供的API来接收请求。

  6、怎么将流还原为传输格式的?

  ?????????Hessian根据其私有的串行化机制来将请求信息进行反序列化,传递给使用者时已是相应的请求信息对象了。

  7、处理完毕后怎么回应?

  ?????????处理完毕后直接返回,hessian将结果对象进行序列化,传输至调用端。

  1. Hessian?调用实例

  2. a)?????????编写服务端代码

写一个接口:

[java]?view plain?copy

  1. public?interface?Hello?{??

  2. ????public?String?seeHello();??

  3. }??

?

编写一个实现:

class?HelloImpl?implements?Hello?{??

  • ???

  • ????private?String?helloStr?=?“Hello?World”;??

  • ???

  • ????public?String?getHelloStr()?{??

  • ???????return?helloStr;??

  • ????}??

  • ???

  • ????void?setHelloStr(String?helloStr)?{??

  • ???????this.helloStr?=?helloStr;??

  • ????}??

  • ???

  • ????public?String?seeHello()?{??

  • ???????return?helloStr;??

  • ????}??

  • ???

  • }??

  • ?

    配置WEB-INF.xml?部署到Web容器中:

    [xhtml]?view plain?copy

    1. <servlet>????

    2. ????????????servlet-name>hello</servlet-class>com.caucho.hessian.server.HessianServletinit-param>????

    3. ????????????????param-name>home-classparam-value>com.alisoft.enet.hessian.HelloImpl>home-api>com.alisoft.enet.hessian.Hello>????

    4. ????????>?????????

    5. ???

    6. ????????servlet-mappingurl-pattern>/hello.xsp>???

    ?

    ?Ok,服务端代码编写完毕。

    ????????

    1. ?????????编写客户端代码

    ?

    class?HelloServiceTest?{??

  • ???

  • ??static?void?main(String[]?args)?throws?Exception?{??

  • ??????

  • ?????String?url?=?“http://localhost/hessian/hello.xsp”;??

  • ???

  • ?????HessianProxyFactory?factory?=?new?HessianProxyFactory();??

  • ?????Hello?hello?=?(Hello)?factory.create(Hello.class,?url);??

  • ???

  • ?????System.out.println(“远程调用结果:?“?+?hello.seeHello());??

  • ???

  • ??}??

  • }??

  • ?

    ?????????执行客户端,即可返回相应的结果:

    ???????????????????远程调用结果: Hello World????????

    ?????????上面的例子是基于?caucho?提供的Hessian?包的基础上做的,实际上Spring的Hessian调用只是对这个进行简单的封装,便于使用。

    ??

    三、Hessian机制

    ? 那么Hessian就是把Java对象转变成?字节序列,然后通过Http传输到?目标服务器上(主机2),主机2收到这个字节序列后,按照一定的协议标准进行反序列,提交给对应的服务处理。处理完成以后以同样的方式返回数据。

    现在我们回头看看例子中的配置(WEB-INF.XML):

    配置的Servlet:?com.caucho.hessian.server.HessianServlet

    对应的参数:接口(home-api):com.alisoft.enet.hessian.Hello

    ????????????????????????????实现(home-class): com.alisoft.enet.hessian.HelloImpl

    HessianServlet?中的实现代码如下(略过部分代码):

    ?

    [java]?view plain?copy

    1. HttpServletRequest?req?=?(HttpServletRequest)?request;??

    2. HttpServletResponse?res?=?(HttpServletResponse)?response;??

    3. InputStream?is?=?request.getInputStream();??

    4. OutputStream?os?=?response.getOutputStream();??

    5. //输入流??

    6. Hessian2Input?in?=?new?Hessian2Input(is);??

    7. SerializerFactory?serializerFactory?=?getSerializerFactory();??

    8. in.setSerializerFactory(serializerFactory);??

    9. //输出流??

    10. AbstractHessianOutput?out;??

    11. int?major?=?in.read();??

    12. int?minor?=?in.read();??

    13. out?=?new?Hessian2Output(os);??

    14. out.setSerializerFactory(serializerFactory);??

    15. _homeSkeleton.invoke(in,?out);??

    ?

    整个执行步骤如下:

    l??接收输入流,并通过SerializerFactory转化为?Hessian?特有的?Hessian2Input

    l??设置输出流,并通过SerializerFactory转化为?Hessian?特有的?Hessian2Output

    l??根据配置的接口和实现参数,调用服务,并把结果写入到输出流?Hessian2Output中

    l???Out.close()

    Hessian远程访问基于序列化和反序列化的方式。当程序运行时,程序所创建的各种对象都位于内存中,当程序运行结束,这些对象就结束了生命周期。对象的序列化主要有两种用途:

    l??把对象的字节序列永久地保存到硬盘上,通常是放在一个文件中。

    l??在网络上传输对象的字节序列

    四.Hessian的优点:

    1- 整个jar很小,200多K,3.1版本的,当然,我下载的for java的版本.

    2- 配置很简单,基本上不需要花什么经历就配置出来了

    3- 功能强大,可以将soap抛开,也可以把EJB抛开,采用二进制来传递对象

    4- 拥有多种语言支持,python?c++? .net 甚至 flex 都可以做为client端

    注:Hessian for java的相关资料下载地址:http://hessian.caucho.com/#Java?。

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读