轉載 hessian學習總結
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伺服器端必須具備以下幾點:
- 包含Hessian的jar包。
- 設計一個介面,用來給客戶端呼叫。
- 實現該介面的功能。
- 配置web.xml,配好相應的servlet。
- 物件必須實現Serializable 介面。
- 對於複雜對像可以使用Map的方法傳遞。
客戶端必須具備以下幾點:
- java客戶端包含Hessian.jar的包。
- 具有和伺服器端結構一樣的介面。
- 利用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
相關文章
- 【轉載】IEEE754 學習總結
- RPC框架-hessian學習RPC框架
- 學習總結
- Web【轉載學習】Web
- ConstraintLayout 學習總結AI
- BOM學習總結
- tkinter學習總結
- vue學習總結Vue
- HSF學習總結
- ElasticSearch 學習總結Elasticsearch
- Storm學習總結ORM
- vue 學習總結Vue
- lua 學習總結
- Angularjs 學習總結AngularJS
- WebRTC學習總結Web
- GCD 學習總結GC
- CompletableFuture學習總結
- awk 學習總結
- MyBatis 學習總結MyBatis
- Maven學習總結Maven
- Ajax學習總結
- JVM學習總結JVM
- mysqlimport學習總結MySqlImport
- WorkFlow學習總結
- JNI 學習總結
- SVG學習總結SVG
- HTML學習總結HTML
- Mybatis學習總結MyBatis
- JavaWeb學習總結JavaWeb
- KUDU學習總結
- pandas 學習總結
- fetch學習總結
- MYSQL學習總結MySql
- 近期學習總結
- 【TS】學習總結
- SpringCloud 學習總結SpringGCCloud
- Kafka 總結學習Kafka
- Typescript學習總結TypeScript
- redis學習總結Redis