java學習之Hessian通訊基礎
阿新 • • 發佈:2018-12-26
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
還有一種遠端呼叫方法就是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