Hessian入門

一、遠程通訊協議的基本原理

  網絡通信需要做的就是將流從一臺計算機傳輸到另外一臺計算機,基於傳輸協議和網絡 IO 來實現,其中傳輸協議比較出名的有 http 、 tcp 、 udp 等等, http 、 tcp 、 udp 都是在基於 Socket 概念上爲某類應用場景而擴展出的傳輸協議,網絡 IO ,主要有 bio 、 nio 、 aio 三種方式,所有的分佈式應用通訊都基於這個原理而實現,只是爲了應用的易用,各種語言通常都會提供一些更爲貼近應用易用的應用層協議。

二、應用級協議Binary-RPC

  Binary-RPC(Remote Procedure Call Protocol,遠程過程調用協議)是一種和RMI(Remote Method Invocation,遠程方法調用)類似的遠程調用的協議,它和RMI 的不同之處在於它以標準的二進制格式來定義請求的信息 ( 請求的對象、方法、參數等 ) ,這樣的好處是什麼呢,就是在跨語言通訊的時候也可以使用。

  Binary -RPC 協議的一次遠程通信過程:

  1 、客戶端發起請求,按照 Binary -RPC 協議將請求信息進行填充;

  2 、填充完畢後將二進制格式文件轉化爲流,通過傳輸協議進行傳輸;

  3 、接收到在接收到流後轉換爲二進制格式文件,按照 Binary -RPC 協議獲取請求的信息並進行處理;

  4 、處理完畢後將結果按照 Binary -RPC 協議寫入二進制格式文件中並返回。

問題總結:

  1 、傳輸的標準格式是標準格式的二進制文件。

  2 、怎麼樣將請求轉化爲傳輸的流?將二進制格式文件轉化爲流。

  3 、怎麼接收和處理流?通過監聽的端口獲取到請求的流,轉化爲二進制文件,根據協議獲取請求的信息,進行處理並將結果寫入 XML 中返回。

  4 、傳輸協議是?http

三、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入門範例

4.1下載Hessian

  去Hessian官網:http://hessian.caucho.com/下載最新的Hessian包,如下圖所示:


下載完成之後,得到如下圖所示的jar文件


4.2、搭建Hessian測試服務端web項目

  新建一個名爲HessianServer的web project。將hessian-4.0.37.jar放入WEB-INF/lib文件夾中,如下圖所示:


在進行基於Hessian的項目開發時,應當注意以下幾點:

  JAVA服務器端必須具備以下幾點:

  1. 包含Hessian的jar包。
  2. 設計一個接口,用來給客戶端調用。
  3. 實現該接口的功能。
  4. 配置web.xml,配好相應的servlet。
  5. 對象必須實現Serializable 接口。
  6. 對於複雜對像可以使用Map的方法傳遞。

  客戶端必須具備以下幾點:

  1. java客戶端包含Hessian.jar的包。
  2. 具有和服務器端結構一樣的接口。
  3. 利用HessianProxyFactory調用遠程接口。

4.3、設計一個提供服務接口來給客戶端調用

ServerService接口的代碼如下:

package com.hessian.service;

import com.hessian.pojo.User;

/*
 * @author lcc
 * @date 2017-2-22 下午3:22:32
 * @description
 * 定義對外提供服務的接口
 */

public interface ServerService {

	/**
	 * @description
	 * 獲取用戶
	 * @return
	 * User對象
	 */
	public User getUser();
}


User類的代碼如下:

package com.hessian.pojo;

import java.io.Serializable;

/*
 * @author lcc
 * @date 2017-2-22 下午3:23:26
 * @description
 * 創建一個User類,實現序列化接口,
 * User實現了序列化接口後就可以進行序列化,
 * 然後就可以通過網絡將序列化後的user傳輸到另一臺計算機上
 */

public class User implements Serializable{
	private static final long serialVersionUID = 1692800630322115854L;
	
	private String name;
	
	public User(){
		
	}
	
	public User(String name){
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
}


4.4、編寫ServerService接口的具體實現類

  ServerServiceImpl實現類的代碼如下:

package com.hessian.service.impl;

import com.hessian.pojo.User;
import com.hessian.service.ServerService;

/*
 * @author lcc
 * @date 2017-2-22 下午3:22:54
 * @description
 * IService接口的具體實現類
 */

public class ServerServiceImpl implements ServerService {

	/**
	 * @description
	 * 實現IService接口的getUser方法
	 * @return
	 * User對象
	 */
	public User getUser() {
		return new User("lc");
	}

}


4.5、配置web.xml,添加對HessianServlet的配置

如下面的紅色部分所示:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>HessianServer</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>  
  
  <servlet>
	<!-- 配置 HessianServlet,Servlet的名字隨便配置,例如這裏配置成ServiceServlet-->
	<servlet-name>ServiceServlet</servlet-name>
	<servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
	
	<!-- 配置接口的具體實現類 -->
	<init-param>
		<param-name>service-class</param-name>
		<param-value>com.hessian.service.impl.ServerServiceImpl</param-value>
	</init-param>
  </servlet>

  <!-- 映射 HessianServlet的訪問URL地址-->
  <servlet-mapping>
	<servlet-name>ServiceServlet</servlet-name>
	<url-pattern>/ServiceServlet</url-pattern>
  </servlet-mapping>
  
</web-app>

到此,Hessian的服務端編寫就算是完成了。

  配置完成之後,啓動項目,在地址欄輸入:http://localhost:端口號/項目名/ServiceServlet,如果顯示結果如下,說明配置和接口編寫正確:




4.6、編寫Hessian的測試客戶端

  新建一個HessianTestClient的普通Java項目作爲測試客戶端,需引入上述的hessian-4.0.37.jar,還需要服務端導出ServerService和User兩個類的jar,放入lib。或創建兩個一摸一樣的類,這裏是採用將服務端的ServerService和User兩個類打包成jar包提供給客戶端進行調用,打成Jar包的過程如下圖所示:

選中要打包的類



這樣就將ServerService類和User類打包成了一個Hessian_Common.jar包,如下圖所示:



創建好的HessianTestClient工程如下所示:



HessianTestClient項目引入上述的hessian-4.0.37.jar和ServerService和User兩個類的jar,編寫HessianClient客戶端,HessianClient類的代碼如下所示:

package com.hessian.testClient;

import java.net.MalformedURLException;

import com.caucho.hessian.client.HessianProxyFactory;
import com.hessian.pojo.User;
import com.hessian.service.ServerService;

/*
 * @author lcc
 * @date 2017-2-22 下午4:01:52
 * @description
 * 將服務器的service和pojo打成jar包引入
 * 調用Hessian的客戶端
 */

public class HessianClient {

	public static void main(String[] args) throws MalformedURLException {
		
		//在服務器端的web.xml文件中配置的HessianServlet映射的訪問URL地址
//		String url = "http://192.168.85.1:8082/HessianServer/ServiceServlet";
		String url = "http://192.168.5.158:8080/HessianServer/ServiceServlet";
		
		HessianProxyFactory factory = new HessianProxyFactory();
		//創建ServerService接口的實例對象
		ServerService service = (ServerService) factory.create(ServerService.class, url);
		
		//調用Hessian服務器端的ServiceImpl類中的getUser方法來獲取一個User對象
		User user = service.getUser();
		System.out.println(user.getName());
	}
}


將HessianServer項目部署到tomcat服務器,啓動tomcat服務器,然後運行HessianClient客戶端,運行結果如下:



從運行結果中可以看到,在HessianClient客戶端中已經成功獲取到遠程的HessianServer服務器端傳輸過來的User對象,然後打印出User對象的名字。

以上就是Hessian的一個入門級別的案例!


4.7、測試項目下載

在我的資源裏面


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章