Hessian通信案例(java)

前言

由于工作的原因,接触到了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 服务端

  1. Eclipse中新建Dynamic Web Project

    此处可以看到需要选择Target runtime,需要首先安装Tomcat。

  2. 导入下载的hessian-4.0-37.jar,右键build path->Add to Build path
    导入完成如图:

  3. 开发步骤

    hessian服务端的开发涉及到3个部分。定义接口&&接口实现&&web.xml

  • 定义接口

新建IBasic.java,随便命名。

1
2
3
4
5
package test;

public interface IBasic {
public String hello();
}

此处做演示,只定义了一个最简单的hello函数,实际情况可以在此文件中增加你的接口函数。接口函数就是服务端暴露出来的服务,可以为客户服务的实际内容。故此接口文件也需要在客户端的开发中用到。

  • 接口实现

新建BasicService.java,随便命名。

1
2
3
4
5
6
7
8
9
10
package test;

public class BasicService implements IBasic {

private String hello= "Hello, world,my name is nick!";

public String hello() {
return hello;
}
}

此文件就是接口函数的具体实现,此处只是针对在IBasic.java中定义好的接口函数。对于小白,简单来说,就是服务端提供了一些服务,或者说暴露了一些服务,也就是接口函数,这些服务供客户端远程调用,就像客户端在本地调用一样,只不过服务端跟客户端的通信采用了一些二进制协议。

  • web.xml
    服务端实现了上述两个文件,基本就算完成了,不过如果需要发布到tomcat运行,还需要在web.xml配置Servlet.

web.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>


<servlet>
<servlet-name>ServerMachine</servlet-name>
<servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
<init-param>
<param-name>home-class</param-name>
<param-value>test.BasicService</param-value>
</init-param>
<init-param>
<param-name>home-api</param-name>
<param-value>test.IBasic</param-value>
</init-param>
</servlet>

<servlet-mapping>
<servlet-name>ServerMachine</servlet-name>
<url-pattern>/ServerMachine</url-pattern>
</servlet-mapping>

</web-app>

图中需要注意的就是servlet-name,可以修改成你自己喜欢的名字,至于具体这个web.xml里面各个字段的意义,我其实也不清楚,我对java不了解,我一直从事C++开发。当时自己尝试了很多遍。如果你配置的时候发布到Tomcat启动不了,那么请反复修改下吧。

此处还需要注意需要有个index.jsp这个脚本,如下:

index.jsp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>

<body>
This is my JSP page. <br>
</body>
</html>

这两个文件的放置的位置也很关键,如果不对,是会出错的。见下图:

4 发布到Tomcat,启动hessian_server

这一步的前提是需要在Eclipse中新建Server并配置好。过程略。毕竟现在不会java的不太多了,我当时为了这小个问题还折腾了好久。

成功后如下:
这里注意到上面的URL: http://localhost:8080/hessian_server,这个地址就是hessian服务端的地址,实际情况将localhost换成服务端所在的IP地址,这个地址客户端需要用到。

hessian服务端到这里就完了。这里我只是用了最简单的方式来设置,实际比较复杂的情况下可以使用spring等,具体我还没研究过。

接下来就是hessian客户端的开发了!!

hessain 客户端

  1. Eclipse中新建Java Project

  2. 导入下载的hessian-4.0-37.jar,右键build path->Add to Build path
    导入完成如图:

  3. 开发步骤

    hessian客户端的开发涉及到2个部分。定义接口&&客户端主程序

  • 定义接口

把上面服务端定义好的接口文件IBasic.java原样复制到工程中。

  • 客户端主程序

新建HessianClient.java,随便命名。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package test;

import com.caucho.hessian.client.HessianProxyFactory;

public class HessianClient{
public static void main(String []args)
throws Exception
{
String url = "http://localhost:8080/hessian_server/ServerMachineTest";
HessianProxyFactory factory = new HessianProxyFactory();
IBasic basic = (IBasic) factory.create(IBasic.class, url);

String helloreturn = basic.hello();
System.out.println(helloreturn);


}
}

注意上面的URL地址。

主要步骤定义服务端的地址URL,然后new一个代理工厂HessainProxyFactory,这个代理类工厂负责远程调用。 然后就可以像调用本地函数一样,调用在IBasic.java中定义好的接口函数hello()。

4 启动客户端

项目上右键Run as->Java Application启动客户端。
成功后结果如下:

至此,小结

至此,完成了Hessian 客户端和服务端的通信。现在回过头来看,可能会觉得比较简单。当时还是折腾了好一会呢!! 简单来说,服务端定义并实现服务,发布到Tomcat,客户端新建一个代理,就像调用本地函数那样调用远程的服务端提供的函数,完成通信。

那么Hessian的底层具体是怎么实现的呢?客户端和服务端是怎么完成了序列化,并反序列的?客户端的代理类工厂是怎么实现的?这些我可能会留到另外的博客里分析。

写完了

写这篇文章是回过头来写,大概中间隔了快4个月的时间,为了写这篇博客,里面用到的一些图片,我又从头搭建了一个服务端和客户端,还是碰到了一些小问题,说明过了段时间是会陌生的。最好的时间是做完那个关于Hessain的项目就应该记录下过程,可以节省很多时间。

坚持写博客还是挺困难的,后面有时间打算再写分析下Hessian的源码以及C++版的Hessain,以及做其他项目涉及到的一些东西。

Blog:

2016-11-17 于杭州
By 史矛革

buy me a cola!

欢迎关注我的其它发布渠道