Hessian通信案例(java)
個人博客: 戳我,戳我
前言
由于工作的原因,接觸到了hessain,項目需要做hessain和xml之間的報文轉換。但是對于hessian是個什么東西一頭霧水。于是接下來的時間了解了hessain協議的序列化規則以及hessian協議進行通信的方式。這篇文章是在完成了這個模塊之后很長一段時間(大概3個月)才記錄的。一來這個時候沒什么事,二來當時就一直打算記錄下學習的過程,后來擱置了。故本文對hessain協議做一個簡單介紹,然后搭建了一個Java版的hessian客戶端和服務端,實現了hessian通信。
什么是Hessian
什么是rpc?
RPC(Remote Procedure Call Protocol)——遠程過程調用協議,它是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,為通信程序之間攜帶信息數據。在OSI網絡通信模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網絡分布式多程序在內的應用程序更加容易。RMI是J2EE中標準的RPC服務,RPC的完美封裝是的將業務邏輯可以進行分布式部署,將運算密集型的工作進行分流(但請求還是同步的),在使用過程中間封裝起實現可以實現在客戶端調用的時候完全透明(需要在RMI客戶端調用方式進行封裝)。
什么是hessian?
Hessian是一個輕量級的,自定義描述的二進制RPC協議。Hessian主要用作面向對象的消息通信。
hessian序列化規則
hessian序列化方式目前有兩個版本1.0和2.0,具體可以查看官網http://hessian.caucho.com/doc/hessian-serialization.html。另外我在我的七牛空間上傳了hessian協議2.0中文版,有需要的話可以下載,防止官網全英文看不懂。另外hessian官網上提供了各種版本的hessian協議的實現,包括java,c++,c#,Python,.NET,Ruby等,上面其實有比較詳細的demo。可以參考,當時我也是參考過的。
Hessian通信案列(java)
環境準備
Eclipse && Tomcat.
資源下載
下載java版的hessian類庫: hessian-4.0.37.jar
hessian 服務端
Eclipse中新建Dynamic Web Project
此處可以看到需要選擇Target runtime,需要首先安裝Tomcat。導入下載的hessian-4.0-37.jar,右鍵build path->Add to Build path
導入完成如圖:開發步驟
hessian服務端的開發涉及到3個部分。定義接口&&接口實現&&web.xml
- 定義接口
新建IBasic.java,隨便命名。
package test;public interface IBasic {
public String hello();
}
此處做演示,只定義了一個最簡單的hello函數,實際情況可以在此文件中增加你的接口函數。接口函數就是服務端暴露出來的服務,可以為客戶服務的實際內容。故此接口文件也需要在客戶端的開發中用到。
- 接口實現
新建BasicService.java,隨便命名。
package test;public class BasicService implements IBasic {private String hello= "Hello, world,my name is nick!"; public String hello() {return hello;
}
}
此文件就是接口函數的具體實現,此處只是針對在IBasic.java中定義好的接口函數。對于小白,簡單來說,就是服務端提供了一些服務,或者說暴露了一些服務,也就是接口函數,這些服務供客戶端遠程調用,就像客戶端在本地調用一樣,只不過服務端跟客戶端的通信采用了一些二進制協議。
- web.xml
服務端實現了上述兩個文件,基本就算完成了,不過如果需要發布到tomcat運行,還需要在web.xml配置Servlet.
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><servlet> <servlet-name>ServerMachine</servlet-name> <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class> <init-param> <param-name>home-class</param-name> <param-value>test.BasicService</param-value> </init-param> <init-param> <param-name>home-api</param-name> <param-value>test.IBasic</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>ServerMachine</servlet-name> <url-pattern>/ServerMachine</url-pattern> </servlet-mapping> </web-app>
圖中需要注意的就是servlet-name,可以修改成你自己喜歡的名字,至于具體這個web.xml里面各個字段的意義,我其實也不清楚,我對java不了解,我一直從事C++開發。當時自己嘗試了很多遍。如果你配置的時候發布到Tomcat啟動不了,那么請反復修改下吧。
此處還需要注意需要有個index.jsp這個腳本,如下:
index.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><base href="<%=basePath%>"><title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">--></head><body>This is my JSP page. <br></body>
</html>
這兩個文件的放置的位置也很關鍵,如果不對,是會出錯的。見下圖:
4 發布到Tomcat,啟動hessian_server
這一步的前提是需要在Eclipse中新建Server并配置好。過程略。畢竟現在不會java的不太多了,我當時為了這小個問題還折騰了好久。
成功后如下:
這里注意到上面的URL: http://localhost:8080/hessian_server,這個地址就是hessian服務端的地址,實際情況將localhost換成服務端所在的IP地址,這個地址客戶端需要用到。
hessian服務端到這里就完了。這里我只是用了最簡單的方式來設置,實際比較復雜的情況下可以使用spring等,具體我還沒研究過。
接下來就是hessian客戶端的開發了!!
hessain 客戶端
Eclipse中新建Java Project
導入下載的hessian-4.0-37.jar,右鍵build path->Add to Build path
導入完成如圖:開發步驟
hessian客戶端的開發涉及到2個部分。定義接口&&客戶端主程序
- 定義接口
把上面服務端定義好的接口文件IBasic.java原樣復制到工程中。
- 客戶端主程序
新建HessianClient.java,隨便命名。
package test;import com.caucho.hessian.client.HessianProxyFactory;public class HessianClient{
public static void main(String []args) throws Exception { String url = "http://localhost:8080/hessian_server/ServerMachineTest"; HessianProxyFactory factory = new HessianProxyFactory(); IBasic basic = (IBasic) factory.create(IBasic.class, url); String helloreturn = basic.hello();System.out.println(helloreturn);}
}
注意上面的URL地址。
主要步驟定義服務端的地址URL,然后new一個代理工廠HessainProxyFactory,這個代理類工廠負責遠程調用。 然后就可以像調用本地函數一樣,調用在IBasic.java中定義好的接口函數hello()。
4 啟動客戶端
項目上右鍵Run as->Java Application啟動客戶端。
成功后結果如下:
至此,小結
至此,完成了Hessian 客戶端和服務端的通信。現在回過頭來看,可能會覺得比較簡單。當時還是折騰了好一會呢!! 簡單來說,服務端定義并實現服務,發布到Tomcat,客戶端新建一個代理,就像調用本地函數那樣調用遠程的服務端提供的函數,完成通信。
那么Hessian的底層具體是怎么實現的呢?客戶端和服務端是怎么完成了序列化,并反序列的?客戶端的代理類工廠是怎么實現的?這些我可能會留到另外的博客里分析。
寫完了
寫這篇文章是回過頭來寫,大概中間隔了快4個月的時間,為了寫這篇博客,里面用到的一些圖片,我又從頭搭建了一個服務端和客戶端,還是碰到了一些小問題,說明過了段時間是會陌生的。最好的時間是做完那個關于Hessain的項目就應該記錄下過程,可以節省很多時間。
堅持寫博客還是挺困難的,后面有時間打算再寫分析下Hessian的源碼以及C++版的Hessain,以及做其他項目涉及到的一些東西。
Blog:
- rebootcat.com (默認)
總結
以上是生活随笔為你收集整理的Hessian通信案例(java)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 体验Remix——安卓电脑
- 下一篇: Hessian源码分析(java)