1. 程式人生 > >Hessian實現遠端呼叫

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提供webservice:

純Hessian實現

配合Spring框架實現

在開始之前當然需要到官網上下載相關的lib包,放入專案的/WEB-INF/lib/下

【一】、純Hessian實現步驟:

1.基本程式碼

首先編寫一個服務的介面類:HelloHessian.java

Java程式碼

  1. package michael.hessian;     
  2. import java.util.List;     
  3. import java.util.Map;     
  4. /**    
  5.  * @author michael    
  6.  *     
  7.  */
  8. publicinterface HelloHessian {     
  9.     String sayHello();     
  10.     MyCar getMyCar();     
  11.     List myLoveFruit();     
  12.     Map myBabays();     
  13. }   

一個java bean檔案MyCar.java:

Java程式碼

  1. package michael.hessian;     
  2. import java.io.Serializable;     
  3. /**    
  4.  * @author michael    
  5.  *     
  6.  */
  7. publicclass MyCar implements Serializable {     
  8. /**    
  9.      *     
  10.      */
  11. privatestaticfinallong serialVersionUID = 4736905401908455439L;     
  12. private String carName;     
  13. private String carModel;     
  14. /**    
  15.      * @return the carName    
  16.      */
  17. public String getCarName() {     
  18. return carName;     
  19.     }     
  20. /**    
  21.      * @return the carModel    
  22.      */
  23. public String getCarModel() {     
  24. return carModel;     
  25.     }     
  26. /**    
  27.      * @param pCarName the carName to set    
  28.      */
  29. publicvoid setCarName(String pCarName) {     
  30.         carName = pCarName;     
  31.     }     
  32. /**    
  33.      * @param pCarModel the carModel to set    
  34.      */
  35. publicvoid setCarModel(String pCarModel) {     
  36.         carModel = pCarModel;     
  37.     }     
  38. /**    
  39.      * @see java.lang.Object#toString()    
  40.      * @return    
  41.      */
  42. @Override
  43. public String toString() {     
  44. return"my car name:[" + this.carName + "] model:[" + this.carModel     
  45.                 + "].";     
  46.     }     
  47. }   

服務端介面的實現類:HelloHessianImpl.java

Java程式碼

  1. package michael.hessian.impl;     
  2. import java.util.ArrayList;     
  3. import java.util.HashMap;     
  4. import java.util.List;     
  5. import java.util.Map;     
  6. import michael.hessian.HelloHessian;     
  7. import michael.hessian.MyCar;     
  8. /**    
  9.  * @author michael    
  10.  *     
  11.  */
  12. publicclass HelloHessianImpl extends HessianServlet implements HelloHessian {     
  13. public MyCar getMyCar() {     
  14.         MyCar car = new MyCar();     
  15.         car.setCarName("阿斯頓·馬丁");     
  16.         car.setCarModel("One-77");     
  17. return car;     
  18.     }     
  19. public Map myBabays() {     
  20.         Map map = new HashMap();     
  21.         map.put("son""孫吳空");     
  22.         map.put("daughter""孫小美");     
  23. return map;     
  24.     }     
  25. public List myLoveFruit() {     
  26.         List list = new ArrayList();     
  27.         list.add("apple");     
  28.         list.add("kiwi");     
  29.         list.add("orange");     
  30. return list;     
  31.     }     
  32. public String sayHello() {     
  33. return"welcom to Hessian";     
  34.     }     
  35. }   

2.配置檔案web.xml修改

在web.xml配置檔案裡增加如下資訊:

Xml程式碼

  1. <servlet>
  2. <servlet-name>HelloHessian</servlet-name>
  3. <servlet-class>
  4.             com.caucho.hessian.server.HessianServlet     
  5.         </servlet-class>
  6. <init-param>
  7. <param-name>home-class<param-name>
  8. <param-value>michael.hessian.impl.HelloHessianImpl<param-value>
  9.        < /init-param>
  10. <init-param>
  11. <param-name>home-api<param-name>
  12. <param-value>michael.hessian.HelloHessian<param-value>
  13.         </init-param>
  14. <load-on-startup>1</load-on-startup>
  15.     </servlet>
  16. <servlet-mapping>
  17. <servlet-name>HelloHessian</servlet-name>
  18. <url-pattern>/HessianService</url-pattern>
  19. </servlet-mapping>

3.java客戶端驗證

Java程式碼

  1. package michael.hessian.client;     
  2. import java.net.MalformedURLException;     
  3. import java.util.Map;     
  4. import michael.hessian.HelloHessian;     
  5. import michael.hessian.MyCar;     
  6. import com.caucho.hessian.client.HessianProxyFactory;     
  7. /**    
  8.  * @author michael    
  9.  *    
  10.  */
  11. publicclass HessianClientTest {     
  12. /**    
  13.      * @param args    
  14.      */
  15. publicstaticvoid main(String[] args) {     
  16.         String url = "http://localhost:8082/J2EE_sjsky/HessianService";     
  17.         HessianProxyFactory factory = <