1. 程式人生 > >java學習之Hessian通訊基礎

java學習之Hessian通訊基礎

    Hessian:hessian是一個輕量級的remoting onhttp工具,使用簡單的方法提供了RMI的功能,相比WebService,Hessian更簡單、快捷。採用的是二進位制RPC協議,因為採用了二進位制協議,所以它很適合於傳送二進位制資料,Hessian主要作面向物件的訊息通訊。Hessian的初衷就是支援動態型別,格式緊湊,跨語言Hessian是使用自己的序列化機制實現的編組和反編組,其支援的資料型別是有限制的,不支援複雜的物件,可以穿透防火牆,在這裡不得不說一下RMI:RMI是一組使用者開發分散式應用程式的API。他使用的是java序列化機制實現呼叫及返回值的編組於反編組。它使用Java語言介面定義了遠端物件,它集合了Java序列化和Java遠端方法協議(Java Remote Method Protocol)。他可以被看做是RPC的Java版本,因為傳統的RPC並不能很好的應用於分散式物件系統。而Java RMI則支援儲存於不同地址空間的程式級物件之間彼此進行通訊,實現遠端物件之間的無縫遠端呼叫。他也有它的缺點,他只能通過RMI協議來進行訪問無法通過HTTP協議訪問,無法穿透防火牆。
    還有一種遠端呼叫方法就是HttpInvoker:他也是將引數和返回值通過Java的序列化機制進行編組和反編組,它具有RMI的支援所有可序列化物件的優點。試使用Http協議傳輸二進位制流的,同時又具有Hessian、Burlap(傳輸xml文字)的優點。
二、寫一個簡單的hessian通訊所需要知道寫哪些內容?
Hessian:寫一個Hessian需要注意的問題:
     1、JAVA伺服器端必須具備以下幾點:
        包含Hessian的jar包
        設計一個介面,用來給客戶端呼叫
        實現該介面的動能
        配置web.xml,配置相應的servlet
        物件必須實現Serializable介面
        對於複雜物件可以使用Map的方法傳遞
     2、客戶端必須具備以下幾點:
        java客戶端包含Hessian.jar包
        具有和伺服器端結構一樣的介面和實體類。包括名稱空間都最好一樣。利用HessianProxyFactory呼叫遠端介面
三、簡單hessian例項:
1、在服務端的介面:
public interface IHello {

    String sayHello();
   
}
2、在服務端的實現類:
public class IHelloImpl extends HessianServlet implements IHello {

    @Override
    public String sayHello() {
        // TODO Auto-generated method stub
        return "Hello,I from HessianService";
    }

}
3、在客戶端的類:
public class ClientTest {

    public static String url = "http://127.0.0.1:8080/HessianService/Hello";
    public static void  main(String[] args){
        HessianProxyFactory factory = new HessianProxyFactory();
        try {
            IHello iHello = (IHello) factory.create(IHello.class, url);
            System.out.println(iHello.sayHello());
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
3、先將伺服器端的類link到客戶端,或者是將伺服器端打包放到客戶端,
4、在web.xml中進行配置:
伺服器端: <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>com.kcpt.hessian.service.IHelloImpl</param-value>
    </init-param>
    <init-param>
      <param-name>home-api</param-name>
      <param-value>com.kcpt.hessian.service.IHello</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Hello</servlet-name>
    <url-pattern>/Hello</url-pattern>
  </servlet-mapping>

執行成功:輸出Hello,I from HessianService,這是簡單的hessian實現方式,看起來比較簡單
四、hessian與spring結合.
在實際應用中,我們不只是簡單的只使用hessian來進行通訊的,如果方法多得話,還不如直接寫在客戶端來呼叫,然而:當hessian與spring結合後,大大減少了這些操作,將dao層的操作全部放在hessian服務端,將業務邏輯全部放在hessian客戶端,這樣的話我們的hessian客戶端和服務端完全分離,因此我們的業務邏輯和dao層就真正的達到了分離,就可以放在不同的伺服器上,當然hessian的通訊的作用不僅僅只有這些。
介面和實現和上邊的一樣:只是在web.xml中配置比較麻煩:
例子:
1、伺服器端:增加remoting-servlet.xml配置檔案:用來配置bean,並將bean匯出為hessian服務:
<?xml version = "1.0" encoding = "UTF-8" ?>
<beans xmlns = "http://www.springframework.org/schema/beans"
       xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop = "http://www.springframework.org/schema/aop"
       xmlns:tx = "http://www.springframework.org/schema/tx"
       xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd