一、 簡介
?? ????? Hessian 是由 caucho 提供的一個基于 binary-RPC 實現的遠程通訊 library 。
1 、是基于什么協議實現的 ?
????????? 基于 Binary-RPC 協議實現。
2 、怎么發起請求 ?
????????? 需通過 Hessian 本身提供的 API 來發起請求。
3 、怎么將請求轉化為符合協議的格式的 ?
????????? Hessian 通過其自定義的串行化機制將請求信息進行序列化,產生二進制流。
4 、使用什么傳輸協議傳輸 ?
????????? Hessian 基于 Http 協議進行傳輸。
5 、響應端基于什么機制來接收請求 ?
????????? 響應端根據 Hessian 提供的 API 來接收請求。
6 、怎么將流還原為傳輸格式的 ?
????????? Hessian 根據其私有的串行化機制來將請求信息進行反序列化,傳遞給使用者時已是相應的請求信息對象了。
7 、處理完畢后怎么回應 ?
????????? 處理完畢后直接返回, hessian 將結果對象進行序列化,傳輸至調用端。
二、 Hessian? 調用實例
a) ????????? 編寫服務端代碼
寫一個接口:
public ? interface ? Hello ?{
???? public ?String seeHello();
}
編寫一個實現:
public ? class ?HelloImpl? implements ?Hello {
?
???? private ?String? helloStr ?=? “Hello World” ;
?
???? public ?String getHelloStr() {
??????? return ? helloStr ;
???? }
?
???? public ? void ?setHelloStr(String helloStr) {
??????? this . helloStr ?= helloStr;
???? }
?
???? public ?String seeHello() {
??????? return ? helloStr ;
???? }
?
}
配置 WEB-INF.xml? 部署到 Web 容器中:
????????? <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.alisoft.enet.hessian.HelloImpl</param-value> ??
????????? ???? </init-param> ??
????????? ???? <init-param> ??
????????? ???????? <param-name>home-api</param-name> ??
????????? ???????? <param-value>com.alisoft.enet.hessian.Hello</param-value> ??
????????? ???? </init-param> ??
????????? </servlet> ??? ?? ??
??
????????? <servlet-mapping> ??
????????? ???? <servlet-name>hello</servlet-name> ??
????????? ???? <url-pattern>/hello.xsp</url-pattern> ??
????????? </servlet-mapping> ?
???????????? Ok ,服務端代碼編寫完畢。
????????
b) ????????? 編寫客戶端代碼
?
public ? class ?HelloServiceTest {
?
?? public ? static ? void ?main(String[] args)? throws ?Exception {
????
????? String url =? “http://localhost/hessian/hello.xsp” ;
?
????? HessianProxyFactory factory =? new ?HessianProxyFactory();
????? Hello hello = (Hello) factory.create(Hello. class , url);
?
????? System. out .println( “ 遠程調用結果 : “ ?+ hello.seeHello());
?
?? }
}
?
????????? 執行客戶端,即可返回相應的結果:
??????????????????? 遠程調用結果 : Hello World ????????
????????? 上面的例子是基于 ?caucho? 提供的 Hessian? 包的基礎上做的,實際上 Spring 的 Hessian 調用只是對這個進行簡單的封裝,便于使用。
? ?
三、Hessian機制
?
?
?
? 那么 Hessian 就是把 Java 對象轉變成 ? 字節序列,然后通過 Http 傳輸到 ? 目標服務器上(主機 2 ),主機 2 收到這個字節序列后,按照一定的協議標準進行反序列,提交給對應的服務處理。處理完成以后以同樣的方式返回數據。
?
現在我們回頭看看例子中的配置( WEB-INF.XML ) :
配置的 Servlet : ? com.caucho.hessian.server.HessianServlet
對應的參數:接口 (home-api) : com.alisoft.enet.hessian.Hello
???????????????????????????? 實現 (home-class): com.alisoft.enet.hessian.HelloImpl
?
?
?
HessianServlet? 中的實現代碼如下(略過部分代碼):
?
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
InputStream is = request.getInputStream();
OutputStream os = response.getOutputStream();
//輸入流
Hessian2Input in = new Hessian2Input(is);
SerializerFactory serializerFactory = getSerializerFactory();
in.setSerializerFactory(serializerFactory);
//輸出流
AbstractHessianOutput out;
int major = in.read();
int minor = in.read();
out = new Hessian2Output(os);
out.setSerializerFactory(serializerFactory);
_homeSkeleton.invoke(in, out);
?
整個執行步驟如下:
l ?? 接收輸入流,并通過 SerializerFactory 轉化為 ?Hessian? 特有的 ? Hessian2Input
l ?? 設置輸出流,并通過 SerializerFactory 轉化為 ?Hessian? 特有的 ? Hessian2Output
l ?? 根據配置的接口和實現參數,調用服務,并把結果寫入到輸出流 ? Hessian2Output 中
l ??? Out.close()
?
Hessian 遠程訪問基于序列化和反序列化的方式。當程序運行時,程序所創建的各種對象都位于內存中,當程序運行結束,這些對象就結束了生命周期。對象的序列化主要有兩種用途:
l ?? 把對象的字節序列永久地保存到硬盤上,通常是放在一個文件中。
l ?? 在網絡上傳輸對象的字節序列
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
