Hessian 是一个序列化协议, 他的优点在于比 Java 原生的对象序列化/反序列化速度更快, 序列化出来以后的数据更小.

序列化协议跟应用层协议无关, 可以将 Hessian 序列化以后的数据放在 HTTP Body 里, 也可以放在 DUBBO 里, 或者直接用 Socket 传输

下面是一个使用 Jetty 跟 Hessian 实现的 Hessian web service 的例子

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>hessian-test</groupId>
<artifactId>hessian-test</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>hessian-test Maven Webapp</name>
<url>http://maven.apache.org</url> <dependencies>
<dependency>
<groupId>com.caucho</groupId>
<artifactId>hessian</artifactId>
<version>4.0.38</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</dependency>
</dependencies>
<build>
<finalName>hessian-test</finalName>
</build>
</project>

提供服务的接口 HelloService

public interface HelloService {

    public String sayHello(String name);
}

服务端的实现

import com.caucho.hessian.server.HessianServlet;

public class HelloServlet extends HessianServlet implements HelloService {
@Override
public String sayHello(String name) {
return "Hello " + name;
}
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.qunar.test.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>

客户端的调用

import com.caucho.hessian.client.HessianProxyFactory;

public class Client {

    public static void main(String[] args) throws Exception {
String url = "http://localhost:8080/hello";
HessianProxyFactory factory = new HessianProxyFactory();
HelloService service = (HelloService) factory.create(HelloService.class, url);
System.out.println(service.sayHello("Vee"));
}
}

tomcat部署后启动, 调用后输出

Hello Vee

用 tcpdump 查看传输的数据

请求

17:07:23.287059 IP localhost.59914 > localhost.http-alt: Flags [P.], seq 1:243, ack 1, win 9186, options [nop,nop,TS val 503550177 ecr 503550095], length 242
0x0000: 4500 0126 5eb1 4000 4006 0000 7f00 0001 E..&^.@.@.......
0x0010: 7f00 0001 ea0a 1f90 b925 a236 308a bf24 .........%.60..$
0x0020: 8018 23e2 ff1a 0000 0101 080a 1e03 90e1 ..#.............
0x0030: 1e03 908f 504f 5354 202f 6865 6c6c 6f20 ....POST./hello.
0x0040: 4854 5450 2f31 2e31 0d0a 436f 6e74 656e HTTP/1.1..Conten
0x0050: 742d 5479 7065 3a20 782d 6170 706c 6963 t-Type:.x-applic
0x0060: 6174 696f 6e2f 6865 7373 6961 6e0d 0a41 ation/hessian..A
0x0070: 6363 6570 742d 456e 636f 6469 6e67 3a20 ccept-Encoding:.
0x0080: 6465 666c 6174 650d 0a55 7365 722d 4167 deflate..User-Ag
0x0090: 656e 743a 204a 6176 612f 312e 372e 305f ent:.Java/1.7.0_
0x00a0: 3531 0d0a 486f 7374 3a20 6c6f 6361 6c68 51..Host:.localh
0x00b0: 6f73 743a 3830 3830 0d0a 4163 6365 7074 ost:8080..Accept
0x00c0: 3a20 7465 7874 2f68 746d 6c2c 2069 6d61 :.text/html,.ima
0x00d0: 6765 2f67 6966 2c20 696d 6167 652f 6a70 ge/gif,.image/jp
0x00e0: 6567 2c20 2a3b 2071 3d2e 322c 202a 2f2a eg,.*;.q=.2,.*/*
0x00f0: 3b20 713d 2e32 0d0a 436f 6e6e 6563 7469 ;.q=.2..Connecti
0x0100: 6f6e 3a20 6b65 6570 2d61 6c69 7665 0d0a on:.keep-alive..
0x0110: 436f 6e74 656e 742d 4c65 6e67 7468 3a20 Content-Length:.
0x0120: 3231 0d0a 0d0a 21....
17:07:23.287089 IP localhost.59914 > localhost.http-alt: Flags [P.], seq 243:264, ack 1, win 9186, options [nop,nop,TS val 503550177 ecr 503550095], length 21
0x0000: 4500 0049 8a49 4000 4006 0000 7f00 0001 E..I.I@.@.......
0x0010: 7f00 0001 ea0a 1f90 b925 a328 308a bf24 .........%.(0..$
0x0020: 8018 23e2 fe3d 0000 0101 080a 1e03 90e1 ..#..=..........
0x0030: 1e03 908f 6302 006d 0008 7361 7948 656c ....c..m..sayHel
0x0040: 6c6f 5300 0356 6565 7a loS..Veez

响应

17:07:23.288131 IP localhost.http-alt > localhost.59914: Flags [P.], seq 1:168, ack 264, win 9170, options [nop,nop,TS val 503550178 ecr 503550177], length 167
0x0000: 4500 00db ab9f 4000 4006 0000 7f00 0001 E.....@.@.......
0x0010: 7f00 0001 1f90 ea0a 308a bf24 b925 a33d ........0..$.%.=
0x0020: 8018 23d2 fecf 0000 0101 080a 1e03 90e2 ..#.............
0x0030: 1e03 90e1 4854 5450 2f31 2e31 2032 3030 ....HTTP/1.1.200
0x0040: 204f 4b0d 0a53 6572 7665 723a 2041 7061 .OK..Server:.Apa
0x0050: 6368 652d 436f 796f 7465 2f31 2e31 0d0a che-Coyote/1.1..
0x0060: 436f 6e74 656e 742d 5479 7065 3a20 782d Content-Type:.x-
0x0070: 6170 706c 6963 6174 696f 6e2f 6865 7373 application/hess
0x0080: 6961 6e0d 0a54 7261 6e73 6665 722d 456e ian..Transfer-En
0x0090: 636f 6469 6e67 3a20 6368 756e 6b65 640d coding:.chunked.
0x00a0: 0a44 6174 653a 2054 6875 2c20 3138 2053 .Date:.Thu,.18.S
0x00b0: 6570 2032 3031 3420 3039 3a30 373a 3233 ep.2014.09:07:23
0x00c0: 2047 4d54 0d0a 0d0a 650d 0a48 0200 5209 .GMT....e..H..R.
0x00d0: 4865 6c6c 6f20 5665 650d 0a Hello.Vee..

可以看到相对于直接传输字符串数据, hessian 序列化以后多了一些控制字符.

//

如果仅仅是传输字符串, 实际上没有必要使用 hessian, 因为这样反而多了序列化反序列的过程, 数据也多了控制字符, 变得更大

而对于复杂的 java 对象, 用 hessian 则更合适

Hessian 初探的更多相关文章

  1. Hessian 原理分析--转

    原文地址:http://blog.csdn.net/zhtang0526/article/details/4788879 一.      远程通讯协议的基本原理 网络通信需要做的就是将流从一台计算机传 ...

  2. Hessian原理分析

    一.      远程通讯协议的基本原理 网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络 IO 来实现,其中传输协议比较出名的有 http . tcp . udp 等等, ...

  3. JVM初探- 使用堆外内存减少Full GC

    JVM初探-使用堆外内存减少Full GC 标签 : JVM 问题: 大部分主流互联网企业线上Server JVM选用了CMS收集器(如Taobao.LinkedIn.Vdian), 虽然CMS可与用 ...

  4. hessian协议原理

    Hessian 原理分析 一.      远程通讯协议的基本原理 网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络 IO 来实现,其中传输协议比较出名的有 http . t ...

  5. spring remoting源码分析--Hessian分析

    1. Caucho 1.1 概况 spring-remoting代码的情况如下: 本节近分析caucho模块. 1.2 分类 其中以hession为例,Hessian远程服务调用过程: Hessian ...

  6. 初探领域驱动设计(2)Repository在DDD中的应用

    概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值类型和领域服务,也稍微讲到了DDD中的分层结构.但这只能算是一个很简单的介绍,并且我们在上篇的末尾还留下了一些问题,其中大家讨论比较多的, ...

  7. CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探

    CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码 ...

  8. 从273二手车的M站点初探js模块化编程

    前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数 ...

  9. JavaScript学习(一) —— 环境搭建与JavaScript初探

    1.开发环境搭建 本系列教程的开发工具,我们采用HBuilder. 可以去网上下载最新的版本,然后解压一下就能直接用了.学习JavaScript,环境搭建是非常简单的,或者说,只要你有一个浏览器,一个 ...

随机推荐

  1. SQL2000的三种“故障还原模型”

    一.SQL2000的三种“故障还原模型” 在数据库属性的“选项”页,“故障还原模型”栏,共有三项选择:简单.完全.大容量日志记录.它们的根本差别在于SQL2000对数据库日志的维护方式不同.下面逐个讲 ...

  2. Java 异步处理简单实践

    Java 异步处理简单实践 http://www.cnblogs.com/fangfan/p/4047932.html 同步与异步 通常同步意味着一个任务的某个处理过程会对多个线程在用串行化处理,而异 ...

  3. C#:org.in2bits.MyXls 文本格式日期 转换,以及设置单元格格式,保留两位小数点

    org.in2bits.MyXls  Excel导入日期格式的处理 表格内容为 2014-7-22 ,导入后显示为 41842 等于一个数值,根本不是日期,后来百度了一下,发现要做如下处理: stri ...

  4. shiro 标签

    在使用Shiro标签库前,首先需要在JSP引入shiro标签: <%@ taglib prefix="shiro" uri="http://shiro.apache ...

  5. case when完成不同条件的显示

    好长时间不写sql了,今天群里问了一个问题: 我想得到的就是  2,3,4,就是低,5,6,7,8,9就是中,10,11....就是高,现在只知道zpcs,怎么得到高中低? case 写的,decod ...

  6. eclipse中没有R文件

    换了台电脑,把eclipse安装上去,很久没用,最近用了一下.发现R文件无法生成.试了各种方法. Project-->Clean:从其他的项目中,复制一个R.java过来:检查语法:勾选上了Pr ...

  7. Centos6.4 用rpm方式安装MySql5.6

    1.查看系统是否安装了MySQL     使用命令:     #rpm -qa | grep mysql    2.卸载已安装的MySQL      卸载mysql命令如下:       #rpm - ...

  8. HashTable,HashSet与Dictionary

    1.HashTable 哈希表(HashTable)表示键/值对的集合.在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现 ...

  9. iOS 关于僵尸对象和僵尸指针的那些事儿

    引言 提到僵尸就感到一种恐怖,大家都知道“僵尸”是没有生命的,但是它确实是一种存在的类似生命体的一种生物.哈哈,当然本文的重点不是讨论“僵尸”,而是有关于ios当中经常遇到的僵尸指针(Zombie P ...

  10. margin:0 auto在IE中失效的解决方案

    转自:http://www.cnblogs.com/hongchenok/archive/2012/11/29/2795041.html 最近在开发项目的时候,发现在火狐浏览器中设置外容器margin ...