一、最簡單的hessian調用--入門
一、遠端通訊協定的基本原理
Hessian是Caucho開發的一種二進制Web Service協定。支援目前所有流行的開發平台。
優點:Hessian協定和web service常用的SOAP協定類似,也是将協定封包封裝在HTTP封包中,通過HTTP信道傳輸的。是以Hessian協定具有與SOAP協定同樣的優點,即傳輸不受防火牆的限制(防火牆通常不限制HTTP信道)。Hessian協定的優點在于:它采用二進制編碼,是以傳輸資料量比SOAP協定要小得多。實踐證明,傳輸同樣的對象,Hessian協定傳輸的資料量比SOAP協定低一個數量級。是以在複雜網絡環境下的分布式應用使用Hessian協定可以獲得更好的性能和可靠性。
網絡通信需要做的就是将流從一台計算機傳輸到另外一台計算機,基于傳輸協定和網絡 IO 來實作,其中傳輸協定比較出名的有 http 、 tcp 、 udp 等等, http 、 tcp 、 udp 都是在基于 Socket 概念上為某類應用場景而擴充出的傳輸協定,網絡 IO ,主要有 bio 、 nio 、 aio 三種方式,所有的分布式應用通訊都基于這個原理而實作,隻是為了應用的易用,各種語言通常都會提供一些更為貼近應用易用的應用層協定。
隻是為了應用的易用,各種語言通常都會提供一些更為貼近應用易用的應用層協定。
二、應用級協定Binary-RPC
Binary-RPC(Remote Procedure Call Protocol,遠端過程調用協定)是一種和RMI(Remote Method Invocation,遠端方法調用)類似的遠端調用的協定,它和RMI 的不同之處在于它以标準的二進制格式來定義請求的資訊 ( 請求的對象、方法、參數等 ) ,這樣的好處是什麼呢,就是在跨語言通訊的時候也可以使用。
Binary -RPC 協定的一次遠端通信過程:
1 、用戶端發起請求,按照 Binary -RPC 協定将請求資訊進行填充;
2 、填充完畢後将二進制格式檔案轉化為流,通過傳輸協定進行傳輸;
3 、接收到在接收到流後轉換為二進制格式檔案,按照 Binary -RPC 協定擷取請求的資訊并進行處理;
4 、處理完畢後将結果按照 Binary -RPC 協定寫入二進制格式檔案中并傳回。
問題總結:
1 、傳輸的标準格式是:标準格式的二進制檔案。
2 、怎麼樣将請求轉化為傳輸的流?将二進制格式檔案轉化為流。
3 、怎麼接收和處理流?通過監聽的端口擷取到請求的流,轉化為二進制檔案,根據協定擷取請求的資訊,進行處理并将結果寫入 XML 中傳回。
4 、傳輸協定是?http
三、Hessian介紹
服務端釋出服務
Hessian是一個輕量級的remoting on http工具,采用的是Binary RPC協定,是以它很适合于發送二進制資料,同時又具有防火牆穿透能力。Hessian一般是通過Web應用來提供服務,是以非常類似于平時我們用的 WebService。隻是它不使用SOAP協定,但相比webservice而言更簡單、快捷。
Hessian官網:http://hessian.caucho.com/
Hessian 可通過Servlet提供遠端服務,需要将比對某個模式的請求映射到Hessian服務。也可Spring架構整合,通過它的 DispatcherServlet可以完成該功能,DispatcherServlet可将比對模式的請求轉發到Hessian服務。Hessian的server端提供一個servlet基類, 用來處理發送的請求,而Hessian的這個遠端過程調用,完全使用動态代理來實作的,,建議采用面向接口程式設計,Hessian服務通過接口暴露。
Hessian處理過程示意圖:用戶端——>序列化寫到輸出流——>遠端方法(伺服器端)——>序列化寫到輸出流 ——>用戶端讀取輸入流——>輸出結果
Hessian在Spring中的工作流程如下:
(1)用戶端:
a.發送遠端請求:
用戶端程式-->調用公共接口的方法-->Hessian攔截器攔截請求-->封裝遠端調用請求-->Hessian代理-->通過HTTP協定發送遠端請求代理到服務端
b.接收遠端調用響應:
遠端調用結果-->HTTP響應-->用戶端
(2)服務端:
a.接收遠端調用請求:
HessianServiceExporter接收請求-->将遠端調用對象封裝為HessianSkeleton架構-->HessianSkeleton處理遠端調用請求
b.傳回遠端調用響應:
HessianSkeleton封裝遠端調用處理結果-->HTTP響應-->用戶端
四、Hessian入門範例
4.1下載下傳Hessian
去Hessian官網:http://hessian.caucho.com/下載下傳最新的Hessian包
在進行基于Hessian的項目開發時,應當注意以下幾點:
JAVA伺服器端必須具備以下幾點:
- 包含Hessian的jar包。
- 設計一個接口,用來給用戶端調用。
- 實作該接口的功能。
- 配置web.xml,配好相應的servlet。
- 對象必須實作Serializable 接口。
- 對于複雜對像可以使用Map的方法傳遞。
用戶端必須具備以下幾點:
- java用戶端包含Hessian.jar的包。
- 具有和伺服器端結構一樣的接口。
- 利用HessianProxyFactory調用遠端接口。
4.3、設計一個提供服務接口來給用戶端調用
接口的代碼如下: 實作:
4.5、配置web.xml,添加對HessianServlet的配置
如下面的紅色部分所示:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
5 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 6 <welcome-file-list>
7 <welcome-file>index.jsp</welcome-file>
8 </welcome-file-list>
910 <servlet>
11 <!-- 配置 HessianServlet,Servlet的名字随便配置,例如這裡配置成ServiceServlet-->
12 <servlet-name>ServiceServlet</servlet-name>
13 <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
14
15 <!-- 配置接口的具體實作類 -->
16 <init-param>
17 <param-name>service-class</param-name>
18 <param-value>gacl.hessian.service.impl.ServiceImpl</param-value>
19 </init-param>
20 </servlet>
21 <!-- 映射 HessianServlet的通路URL位址-->
22 <servlet-mapping>
23 <servlet-name>ServiceServlet</servlet-name>
24 <url-pattern>/ServiceServlet</url-pattern>
25 </servlet-mapping>2627 </web-app>
到此,Hessian的服務端編寫就算是完成了。
配置完成之後,啟動項目,在位址欄輸入:http://localhost:端口号/項目名/ServiceServlet,如果顯示結果如下,說明配置和接口編寫正确:
Hessian Requires POST
4.6、編寫Hessian的測試用戶端
類打包成jar包提供給用戶端進行調用,打成Jar包的過程如下圖所示
編寫HessianClient用戶端,HessianClient類的代碼如下所示:
-------------------------------------------------------------------------------------------------------------------------------------------------------- 二、hessian與spring整合 首先,伺服器端配置,web.xml配置 此處,dispatcherServlet兩處相同,但是測試時可以通過,但是項目中應該隻有一處。 再增加一個配置檔案 hessianServiceExporter導出為hessian服務。 服務端配置好後,啟動tomcat,浏覽器打開如下,
HTTP Status 405 - HessianServiceExporter only supports POST requests
則說明正确。 用戶端配置,增加一個配置檔案。 完成。 注意:可能發生 1.對象的命名空間要一緻 2.注意傳遞的資料類型 參考來源:
http://www.cnblogs.com/yjmyzz/p/hessian-helloworld.html http://www.cnblogs.com/xdp-gacl/p/3897534.html http://blog.csdn.net/chjttony/article/details/6567511看不懂 http://blog.csdn.net/isea533/article/details/45038779 http://www.360doc.com/content/13/1217/09/14416931_337783880.shtml http://www.cnblogs.com/hzmark/archive/2012/11/27/Hessian.html
轉載于:https://www.cnblogs.com/jingRegina/p/5175536.html