一、遠程通訊協議的基本原理
網絡通信需要做的就是將流從一臺計算機傳輸到另外一臺計算機,基於傳輸協議和網絡 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服務器端必須具備以下幾點:
- 包含Hessian的jar包。
- 設計一個接口,用來給客戶端調用。
- 實現該接口的功能。
- 配置web.xml,配好相應的servlet。
- 對象必須實現Serializable 接口。
- 對於複雜對像可以使用Map的方法傳遞。
客戶端必須具備以下幾點:
- java客戶端包含Hessian.jar的包。
- 具有和服務器端結構一樣的接口。
- 利用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、測試項目下載
在我的資源裏面