轉載 hessian學習總結

zhengdesheng19930211發表於2017-03-21

轉載

孤傲蒼狼

http://www.cnblogs.com/xdp-gacl/p/3897534.html

只為成功找方法,不為失敗找藉口!

Hessian學習總結(一)——Hessian入門

一、遠端通訊協議的基本原理

  網路通訊需要做的就是將流從一臺計算機傳輸到另外一臺計算機,基於傳輸協議和網路 IO 來實現,其中傳輸協議比較出名的有 http 、tcp 、 udp 等等, http 、 tcp 、 udp 都是在基於 Socket 概念上為某類應用場景而擴充套件出的傳輸協議,網路IO ,主要有 bio 、 nio 、 aio三種方式,所有的分散式應用通訊都基於這個原理而實現,只是為了應用的易用,各種語言通常都會提供一些更為貼近應用易用的應用層協議。

二、應用級協議Binary-RPC

  Binary-RPC(RemoteProcedure Call Protocol,遠端過程呼叫協議)是一種和RMI(Remote MethodInvocation,遠端方法呼叫)類似的遠端呼叫的協議,它和RMI的不同之處在於它以標準的二進位制格式來定義請求的資訊 ( 請求的物件、方法、引數等 ),這樣的好處是什麼呢,就是在跨語言通訊的時候也可以使用。

  Binary -RPC協議的一次遠端通訊過程:

  1 、客戶端發起請求,按照Binary -RPC 協議將請求資訊進行填充;

  2、填充完畢後將二進位制格式檔案轉化為流,通過傳輸協議進行傳輸;

  3、接收到在接收到流後轉換為二進位制格式檔案,按照 Binary -RPC 協議獲取請求的資訊並進行處理;

  4 、處理完畢後將結果按照Binary -RPC 協議寫入二進位制格式檔案中並返回。

問題總結:

  1、傳輸的標準格式是標準格式的二進位制檔案。

  2、怎麼樣將請求轉化為傳輸的流?將二進位制格式檔案轉化為流。

  3、怎麼接收和處理流?通過監聽的埠獲取到請求的流,轉化為二進位制檔案,根據協議獲取請求的資訊,進行處理並將結果寫入 XML中返回。

  4、傳輸協議是?http

三、Hessian介紹

Hessian是一個輕量級的remoting on http工具,採用的是BinaryRPC協議,所以它很適合於傳送二進位制資料,同時又具有防火牆穿透能力。Hessian一般是通過Web應用來提供服務,因此非常類似於平時我們用的WebService。只是它不使用SOAP協議,但相比webservice而言更簡單、快捷。

Hessian官網:http://hessian.caucho.com/

Hessian 可通過Servlet提供遠端服務,需要將匹配某個模式的請求對映到Hessian服務。也可Spring框架整合,通過它的DispatcherServlet可以完成該功能,DispatcherServlet可將匹配模式的請求轉發到Hessian服務。Hessian的server端提供一個servlet基類,用來處理髮送的請求,而Hessian的這個遠端過程呼叫,完全使用動態代理來實現的,,建議採用面向介面程式設計,Hessian服務通過介面暴露。

Hessian處理過程示意圖:客戶端——>序列化寫到輸出流——>遠端方法(伺服器端)——>序列化寫到輸出流——>客戶端讀取輸入流——>輸出結果

Hessian入門範例

4.1下載Hessian

  去Hessian官網:http://hessian.caucho.com/下載最新的Hessian包,如下圖所示:

  

  下載完成之後,得到如下圖所示的jar檔案

  

4.2、搭建Hessian測試服務端web專案

  新建一個名為HessianServer的webproject。將hessian-4.0.37.jar放入WEB-INF/lib資料夾中,如下圖所示:

  

  在進行基於Hessian的專案開發時,應當注意以下幾點:

  JAVA伺服器端必須具備以下幾點:

  1. 包含Hessian的jar包。
  2. 設計一個介面,用來給客戶端呼叫。
  3. 實現該介面的功能。
  4. 配置web.xml,配好相應的servlet。
  5. 物件必須實現Serializable 介面。
  6. 對於複雜對像可以使用Map的方法傳遞。

  客戶端必須具備以下幾點:

  1. java客戶端包含Hessian.jar的包。
  2. 具有和伺服器端結構一樣的介面。
  3. 利用HessianProxyFactory呼叫遠端介面。

4.3、設計一個提供服務介面來給客戶端呼叫

IService介面的程式碼如下:

複製程式碼
 1 package gacl.hessian.service;
 2 
 3 import gacl.hessian.model.User;
 4 
 5 
12 public interface IService {
13 
14     
20     public User getUser();
21 }
複製程式碼

  IService介面中用到了一個User類

User類的程式碼如下:

複製程式碼
 1 package gacl.hessian.model;
 2 
 3 import java.io.Serializable;
 4 
 5 
14 public class User implements Serializable{
15 
16     private static final long serialVersionUID = 1692800630322115854L;
17     //name屬性
18     private String name;
19 
20     public User() {
21         
22     }
23 
24     public User(String name) {
25         this.name = name;
26     }
27 
28     public String getName() {
29         return name;
30     }
31 
32     public void setName(String name) {
33         this.name = name;
34     }
35     
36     
37 }
複製程式碼

4.4、編寫IService介面的具體實現類

  ServiceImpl實現類的程式碼如下:

複製程式碼
 1 package gacl.hessian.service.impl;
 2 
 3 import gacl.hessian.model.User;
 4 import gacl.hessian.service.IService;
 5 
 6 
13 public class ServiceImpl implements IService {
14 
15     
22     public User getUser() {
23         return new User("孤傲蒼狼");
24     }
25 }
複製程式碼

4.5、配置web.xml,新增對HessianServlet的配置

如下面的紅色部分所示:

複製程式碼
 1 
 2  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     
 7         index.jsp
 8     
 9 
10     11 12 ServiceServlet 13 com.caucho.hessian.server.HessianServlet 14 15 16 17 service-class 18 gacl.hessian.service.impl.ServiceImpl 19 20 
21     
22     
23         ServiceServlet
24         /ServiceServlet
25     
26 
27 
複製程式碼

   到此,Hessian的服務端編寫就算是完成了。

  配置完成之後,啟動專案,在位址列輸入:http://localhost:埠號/專案名/ServiceServlet,如果顯示結果如下,說明配置和介面編寫正確:

  Hessian Requires POST

  

4.6、編寫Hessian的測試客戶端

  新建一個HessianTestClient的普通Java專案作為測試客戶端,需引入上述的hessian-4.0.37.jar,還需要服務端匯出IService和User兩個類的jar,放入lib。或建立兩個一摸一樣的類,這裡是採用將服務端的IService和User兩個類打包成jar包提供給客戶端進行呼叫,打成Jar包的過程如下圖所示:

選中要打包的類

  這樣就將IService類和User類打包成了一個Hessian_Common.jar包,如下圖所示:

 

  建立好的HessianTestClient工程如下所示:

  

  HessianTestClient專案引入上述的hessian-4.0.37.jar和IService和User兩個類的jar,編寫HessianClient客戶端,HessianClient類的程式碼如下所示:

複製程式碼
 1 package hessian.test.client;
 2 
 3 import java.net.MalformedURLException;
 4 
 5 import gacl.hessian.model.User;
 6 import gacl.hessian.service.IService;
 7 
 8 import com.caucho.hessian.client.HessianProxyFactory;
 9 
10 
17 public class HessianClient {
18 
19     public static void main(String[] args) throws MalformedURLException {
20         
38         //在伺服器端的web.xml檔案中配置的HessianServlet對映的訪問URL地址
39         String url = "http://192.168.1.144:8080/HessianServer/ServiceServlet";
40         HessianProxyFactory factory = new HessianProxyFactory();
41         IService service = (IService) factory.create(IService.class, url);//建立IService介面的例項物件
42         User user = service.getUser();//呼叫Hessian伺服器端的ServiceImpl類中的getUser方法來獲取一個User物件
43         System.out.println(user.getName());
44     }
45 }
複製程式碼

  將HessianServer專案部署到tomcat伺服器,啟動tomcat伺服器,然後執行HessianClient客戶端,執行結果如下:

  

  從執行結果中可以看到,在HessianClient客戶端中已經成功獲取到遠端的HessianServer伺服器端傳輸過來的User物件,然後列印出User物件的名字。

  以上就是Hessian的一個入門級別的案例!

4.7、測試專案下載

  Hessian服務端:HessianServer,Hessian測試客戶端:HessianTestClient