Hessian官方用户文档

简介: <p><a target="_blank" href="http://hessian.caucho.com/doc/hessian-overview.xtp">原文链接点这里</a><br></p> <p><span style="font-family:Microsoft YaHei; font-size:12px">Hessian 是一个用于连接网络服务的二进制协议,他的com.ca

原文链接点这里

Hessian 是一个用于连接网络服务的二进制协议,他的com.caucho.hessian.client 和 com.caucho.hessian.server包不依赖于任何其他Resin的类(Resin是caucho公司的一个很快的Web服务器,Hessian是他的一部分),因此他能够应用于更小的客户端,比如Java Applet。其实也是因为不依赖所以也可以在任何容器比如Tomcat,Jetty中很方便的使用。

因为他是一个短小的协议,它能够应用于手机端,来连接Resin这样的web服务器。 因为它比较精悍,因此他能够使用在EJB中。

就算Hessian规范内容的本身,也是短小而令人关注的。  这个是说很多通讯框架其实都可以使用这个规范来序列化及反序列化类。

Hessian Client

从一个Java客户端使用Hessian服务就像调用一个方法。 HessianProxyFactory创建的代理可以看为一个普通的Java对象,只不过这个对象有可能在远程连接错误的时候抛出协议异常。

HessianProxyFactory依赖于JDK1.3及以上版本。

每一个服务将有一个Java接口用于描述这个服务。下面的这个Hello ,World 示例仅仅返回了String, 因为Hessian支持Java的序列化,一次直接使用Java的类型。

//API for Basic service
package example;

public interface Basic {
  public String hello();
}
下面 是一个单独的Hessian Client, 这个Client创建了HessianProxyFactory, 客户端使用Factory根据给定的URL及Java API接口创建一个Stub. 这个存根是一个该Java API的实现类。

// Hessian Client for Basic service
package example;

import com.caucho.hessian.client.HessianProxyFactory;

public class BasicClient {
  public static void main(String []args)
    throws Exception
  {
    String url = "http://www.caucho.com/hessian/test/basic";

    HessianProxyFactory factory = new HessianProxyFactory();
    Basic basic = (Basic) factory.create(Basic.class, url);

    System.out.println("Hello: " + basic.hello());
  }
}
这样就够了,不需要任何额外的操作了。服务还可以添加其他的方法,其可以包含任何Java类型的返回值,或者是任何Java类型的参数。

Hessian Service
虽然大多数的Hessian服务都将使用Resin-CMP 和 Resin-EJB,已充分利用EJB的优点。 但是Hessian库使得它能够通过HessianServlet进行扩展。
任何共有的方法都会识别为一个服务方法,因此创建服务方法跟写一个普通的方法是一样的。
因为服务是使用Servlet来实现的,因此可以像普通的Servlet一样使用ServletContext中的内容。
//Hello Service
package example;

public class BasicService implements Basic {
  private String _greeting = "Hello, world";

  public void setGreeting(String greeting)
  {
    _greeting = greeting;
  }

  public String hello()
  {
    return _greeting;
  }
}
在Resin3.0中的配置:
<web-app xmlns="http://caucho.com/ns/resin">
  <servlet servlet-name="hello"
           servlet-class="com.caucho.hessian.server.HessianServlet">
    <init>
      <home resin:type="example.BasicService">
        <greeting>Hello, world</greeting>
      </home>

      <home-api>example.Basic</home-api>
    </init>
  </servlet>

  <servlet-mapping url-pattern="/hello"
                   servlet-name="hello"/>
</web-app>
通用的web.xml的配置:
<web-app>
  <servlet>
   <servlet-name>hello</servlet-name>
   <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
    <init-param>
      <param-name>home-class</param-name>
      <param-value>example.BasicService</param-value>
    </init-param>
    <init-param>
      <param-name>home-api</param-name>
      <param-value>example.Basic</param-value>
    </init-param>
  </servlet>

  <servlet-mapping>
    <url-pattern>/hello</url-pattern>
    <servlet-name>hello</servlet-name>
  </servlet-mapping>
</web-app>

Hessian Serialization

Hessian类可以被用来做序列化和反序列化。

应用程序使用Hessian来做序列化是很高效的。

//Serialization
Object obj = ...;

OutputStream os = new FileOutputStream("test.xml");
Hessian2Output out = new Hessian2Output(os);

out.writeObject(obj);
os.close();

// Deserialization
InputStream is = new FileInputStream("test.xml");
Hessian2Input in = new Hessian2Input(is);

Object obj = in.readObject(null);
is.close();

当序列化的接口比简单类型和String更负责的时候请确保该类实现了java.io.Serializable接口。

Hessian with large binary data

当应用程序想需要传输大量的二进制数据时,可以使用流来避免创建很大的字节数组。

只有方法的最后一个参数可以是InputStream,因为数据食杂方法调用的时候读取的。

例如,一个文件下载服务器也是可以有效的使用Hessian来搭建的

在下面的例子中,用户需要直接的控制Hessian协议,因为在方法返回前需要缓存这个文件。

// file upload API
package example;

public interface Upload {
  public void upload(String filename, InputStream data);
}
如果返回值是一个InputStream, 那么在finally块中调用InputStream.close()是非常必要的,
因为在所有数据读取完且关闭Stream前,Hessian不会关闭底层的Httpstream.

// file download API
package example;

public interface Download {
  public InputStream download(String filename, InputStream data);
}
// Download Java Code
InputStream is = fileProxy.download("test.xml");

try {
  ... // read data here
} finally {
  is.close();
}

Hessian Debugging

Hessian Debug功能需要3.1.3或者更高版本
开启Hessian Servlet Debug拢共需要两步。首先,"debug" init-param必须设置在web.xml中,HessianServlet的日志级别必须为fine.Resin上的配置如下:

resin-web.xml enabling debugging
<web-app xmlns="http://caucho.com/ns/resin">

  <servlet-mapping url-pattern="/my-bean"
                   servlet-class="example.MyBean">
    <init debug="true"/>
  </servlet-mapping>

  <log name="com.caucho.hessian.server" level="fine"
          path="stdout:"/>

</web-app>
日志内容:

sample debugging output
public class MyBean extends HessianServlet {
  public example.Combine combine(String a, String b)
}


[2007/05/08 02:51:31.000] call 2.0
[2007/05/08 02:51:31.000]   method "combine"
[2007/05/08 02:51:31.000]   "hello"
[2007/05/08 02:51:31.000]   "world"
[2007/05/08 02:51:31.000] reply 2.0
[2007/05/08 02:51:31.000]   /* defun example.Combine [a, b] */
[2007/05/08 02:51:31.000]   object example.Combine (#1)
[2007/05/08 02:51:31.000]     a: "hello"
[2007/05/08 02:51:31.000]     b: "world"

Hessian Streaming

Hessian3.1.3介绍了流API, 客户端可以使用流API发送周期性数据,例如在Comet-style显存监控项目中持续接收数据

// Streaming
import com.caucho.hessian.io.*;

void send(OutputStream os)
{
  Hessian2StreamingOutput out;
  out = new Hessian2StreamingOutput(os);

  Object data;

  while ((data = getNextChunk()) != null) {
    out.writeObject(data);
  }

  out.close();
}


Hessian Client for a cell-phone
Hessian甚至能够使用在小型Java设备中,通过如下的类,Hessian能够在J2ME中进行使用:
  • MicroHessianInput
  • MicroHessianOutput
  • HessianRemote
  • HessianServiceException
  • HessianProtocolException
下面的代码示例了使用手机作为一个客户端:
// Hello, world
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;

...

MicroHessianInput in = new MicroHessianInput();

String url = "http://www.caucho.com/hessian/test/basic";

HttpConnection c = (HttpConnection) Connector.open(url);

c.setRequestMethod(HttpConnection.POST);

OutputStream os = c.openOutputStream();
MicroHessianOutput out = new MicroHessianOutput(os);

out.call("hello", null);

os.flush();

is = c.openInputStream();

MicroHessianInput in = new MicroHessianInput(is);
Object value = in.readReply(null);



相关文章
|
2月前
|
Dubbo Java 应用服务中间件
Rpc编程系列文章第三篇:Hessian RPC一个老的RPC框架
Rpc编程系列文章第三篇:Hessian RPC一个老的RPC框架
|
9月前
|
编解码 Rust 自然语言处理
gRPC源码分析(三):从Github文档了解gRPC的项目细节
从这里可以看出,gRPC虽然是支持多语言,但原生的实现并不多。如果想在一些小众语言里引入gRPC,还是有很大风险的,有兴趣的可以搜索下TiDB在探索rust的gRPC的经验分享。
147 1
|
2月前
|
JSON 缓存 Java
ProtoBuf-gRPC实践
gRPC 是一个高性能、开源、通用的 RPC 框架,基于 HTTP/2 设计,使用 Protocol Buffers(ProtoBuf)作为序列化协议。ProtoBuf 允许定义服务接口和消息类型,编译器会生成客户端和服务器端的代码,简化了跨平台的通信。 **gRPC 学习背景** 1. **为什么要学gRPC**:提高网络通信效率,支持多平台、多语言,提供高效序列化和反序列化,以及可靠的安全性和流控。 2. **RPC是什么**:远程过程调用,允许一个程序调用另一个不在同一设备上的程序。 3. **网络库收益分析**:gRPC 提供高效、安全、易用的网
161 0
|
9月前
|
负载均衡
gRPC源码分析(二):从官网文档看gRPC的特性
在第一部分,我们学习了gRPC的基本调用过程,这样我们对全局层面有了一定了解。接下来,我们将结合官方文档,继续深入学习、探索下去。
37 0
|
XML 存储 JSON
gRPC(二)入门:Protobuf入门
Any以字节的形式包含任意序列化的消息,以及作为该消息类型的全局唯一标识符并解析为该消息类型的URL。要使用Any类型,您需要 import google/protobuf/any.proto
394 0
gRPC(二)入门:Protobuf入门
|
Dubbo 算法 安全
Java序列化案例demo(包含Kryo、JDK原生、Protobuf、ProtoStuff以及hessian)(二)
Java序列化案例demo(包含Kryo、JDK原生、Protobuf、ProtoStuff以及hessian)(二)
Java序列化案例demo(包含Kryo、JDK原生、Protobuf、ProtoStuff以及hessian)(二)
|
SQL 存储 Java
Java序列化案例demo(包含Kryo、JDK原生、Protobuf、ProtoStuff以及hessian)(一)
Java序列化案例demo(包含Kryo、JDK原生、Protobuf、ProtoStuff以及hessian)(一)
Java序列化案例demo(包含Kryo、JDK原生、Protobuf、ProtoStuff以及hessian)(一)
|
Java
Protobuf&GRPC 的基本使用
首先对比一下Java自带的序列化与Protobuf的序列化的大小差异 public static void main(String[] args) throws Exception { Person.
3204 0
|
Java API
分布式系统开发工具包 —— 基于Hessian的HTTP RPC调用技术
hessian是二进制web service协议。 # Hessian介绍 创建Hessian服务包括四个步骤: 1. 创建Java接口,用于提供公开服务 2. 使用HessianProxyFactory创建客户端 3. 创建服务实现类 4. 在servlet引擎中配置服务
1495 0