Hessian通信案例(java)
個(gè)人博客: 戳我,戳我
前言
由于工作的原因,接觸到了hessain,項(xiàng)目需要做hessain和xml之間的報(bào)文轉(zhuǎn)換。但是對(duì)于hessian是個(gè)什么東西一頭霧水。于是接下來的時(shí)間了解了hessain協(xié)議的序列化規(guī)則以及hessian協(xié)議進(jìn)行通信的方式。這篇文章是在完成了這個(gè)模塊之后很長一段時(shí)間(大概3個(gè)月)才記錄的。一來這個(gè)時(shí)候沒什么事,二來當(dāng)時(shí)就一直打算記錄下學(xué)習(xí)的過程,后來擱置了。故本文對(duì)hessain協(xié)議做一個(gè)簡單介紹,然后搭建了一個(gè)Java版的hessian客戶端和服務(wù)端,實(shí)現(xiàn)了hessian通信。
什么是Hessian
什么是rpc?
RPC(Remote Procedure Call Protocol)——遠(yuǎn)程過程調(diào)用協(xié)議,它是一種通過網(wǎng)絡(luò)從遠(yuǎn)程計(jì)算機(jī)程序上請(qǐng)求服務(wù),而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議。RPC協(xié)議假定某些傳輸協(xié)議的存在,如TCP或UDP,為通信程序之間攜帶信息數(shù)據(jù)。在OSI網(wǎng)絡(luò)通信模型中,RPC跨越了傳輸層和應(yīng)用層。RPC使得開發(fā)包括網(wǎng)絡(luò)分布式多程序在內(nèi)的應(yīng)用程序更加容易。RMI是J2EE中標(biāo)準(zhǔn)的RPC服務(wù),RPC的完美封裝是的將業(yè)務(wù)邏輯可以進(jìn)行分布式部署,將運(yùn)算密集型的工作進(jìn)行分流(但請(qǐng)求還是同步的),在使用過程中間封裝起實(shí)現(xiàn)可以實(shí)現(xiàn)在客戶端調(diào)用的時(shí)候完全透明(需要在RMI客戶端調(diào)用方式進(jìn)行封裝)。
什么是hessian?
Hessian是一個(gè)輕量級(jí)的,自定義描述的二進(jìn)制RPC協(xié)議。Hessian主要用作面向?qū)ο蟮南⑼ㄐ拧?/p>
hessian序列化規(guī)則
hessian序列化方式目前有兩個(gè)版本1.0和2.0,具體可以查看官網(wǎng)http://hessian.caucho.com/doc/hessian-serialization.html。另外我在我的七牛空間上傳了hessian協(xié)議2.0中文版,有需要的話可以下載,防止官網(wǎng)全英文看不懂。另外hessian官網(wǎng)上提供了各種版本的hessian協(xié)議的實(shí)現(xiàn),包括java,c++,c#,Python,.NET,Ruby等,上面其實(shí)有比較詳細(xì)的demo。可以參考,當(dāng)時(shí)我也是參考過的。
Hessian通信案列(java)
環(huán)境準(zhǔn)備
Eclipse && Tomcat.
資源下載
下載java版的hessian類庫: hessian-4.0.37.jar
hessian 服務(wù)端
Eclipse中新建Dynamic Web Project
此處可以看到需要選擇Target runtime,需要首先安裝Tomcat。導(dǎo)入下載的hessian-4.0-37.jar,右鍵build path->Add to Build path
導(dǎo)入完成如圖:開發(fā)步驟
hessian服務(wù)端的開發(fā)涉及到3個(gè)部分。定義接口&&接口實(shí)現(xiàn)&&web.xml
- 定義接口
新建IBasic.java,隨便命名。
package test;public interface IBasic {
public String hello();
}
此處做演示,只定義了一個(gè)最簡單的hello函數(shù),實(shí)際情況可以在此文件中增加你的接口函數(shù)。接口函數(shù)就是服務(wù)端暴露出來的服務(wù),可以為客戶服務(wù)的實(shí)際內(nèi)容。故此接口文件也需要在客戶端的開發(fā)中用到。
- 接口實(shí)現(xiàn)
新建BasicService.java,隨便命名。
package test;public class BasicService implements IBasic {private String hello= "Hello, world,my name is nick!"; public String hello() {return hello;
}
}
此文件就是接口函數(shù)的具體實(shí)現(xiàn),此處只是針對(duì)在IBasic.java中定義好的接口函數(shù)。對(duì)于小白,簡單來說,就是服務(wù)端提供了一些服務(wù),或者說暴露了一些服務(wù),也就是接口函數(shù),這些服務(wù)供客戶端遠(yuǎn)程調(diào)用,就像客戶端在本地調(diào)用一樣,只不過服務(wù)端跟客戶端的通信采用了一些二進(jìn)制協(xié)議。
- web.xml
服務(wù)端實(shí)現(xiàn)了上述兩個(gè)文件,基本就算完成了,不過如果需要發(fā)布到tomcat運(yùn)行,還需要在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,可以修改成你自己喜歡的名字,至于具體這個(gè)web.xml里面各個(gè)字段的意義,我其實(shí)也不清楚,我對(duì)java不了解,我一直從事C++開發(fā)。當(dāng)時(shí)自己嘗試了很多遍。如果你配置的時(shí)候發(fā)布到Tomcat啟動(dòng)不了,那么請(qǐng)反復(fù)修改下吧。
此處還需要注意需要有個(gè)index.jsp這個(gè)腳本,如下:
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>
這兩個(gè)文件的放置的位置也很關(guān)鍵,如果不對(duì),是會(huì)出錯(cuò)的。見下圖:
4 發(fā)布到Tomcat,啟動(dòng)hessian_server
這一步的前提是需要在Eclipse中新建Server并配置好。過程略。畢竟現(xiàn)在不會(huì)java的不太多了,我當(dāng)時(shí)為了這小個(gè)問題還折騰了好久。
成功后如下:
這里注意到上面的URL: http://localhost:8080/hessian_server,這個(gè)地址就是hessian服務(wù)端的地址,實(shí)際情況將localhost換成服務(wù)端所在的IP地址,這個(gè)地址客戶端需要用到。
hessian服務(wù)端到這里就完了。這里我只是用了最簡單的方式來設(shè)置,實(shí)際比較復(fù)雜的情況下可以使用spring等,具體我還沒研究過。
接下來就是hessian客戶端的開發(fā)了!!
hessain 客戶端
Eclipse中新建Java Project
導(dǎo)入下載的hessian-4.0-37.jar,右鍵build path->Add to Build path
導(dǎo)入完成如圖:開發(fā)步驟
hessian客戶端的開發(fā)涉及到2個(gè)部分。定義接口&&客戶端主程序
- 定義接口
把上面服務(wù)端定義好的接口文件IBasic.java原樣復(fù)制到工程中。
- 客戶端主程序
新建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地址。
主要步驟定義服務(wù)端的地址URL,然后new一個(gè)代理工廠HessainProxyFactory,這個(gè)代理類工廠負(fù)責(zé)遠(yuǎn)程調(diào)用。 然后就可以像調(diào)用本地函數(shù)一樣,調(diào)用在IBasic.java中定義好的接口函數(shù)hello()。
4 啟動(dòng)客戶端
項(xiàng)目上右鍵Run as->Java Application啟動(dòng)客戶端。
成功后結(jié)果如下:
至此,小結(jié)
至此,完成了Hessian 客戶端和服務(wù)端的通信。現(xiàn)在回過頭來看,可能會(huì)覺得比較簡單。當(dāng)時(shí)還是折騰了好一會(huì)呢!! 簡單來說,服務(wù)端定義并實(shí)現(xiàn)服務(wù),發(fā)布到Tomcat,客戶端新建一個(gè)代理,就像調(diào)用本地函數(shù)那樣調(diào)用遠(yuǎn)程的服務(wù)端提供的函數(shù),完成通信。
那么Hessian的底層具體是怎么實(shí)現(xiàn)的呢?客戶端和服務(wù)端是怎么完成了序列化,并反序列的?客戶端的代理類工廠是怎么實(shí)現(xiàn)的?這些我可能會(huì)留到另外的博客里分析。
寫完了
寫這篇文章是回過頭來寫,大概中間隔了快4個(gè)月的時(shí)間,為了寫這篇博客,里面用到的一些圖片,我又從頭搭建了一個(gè)服務(wù)端和客戶端,還是碰到了一些小問題,說明過了段時(shí)間是會(huì)陌生的。最好的時(shí)間是做完那個(gè)關(guān)于Hessain的項(xiàng)目就應(yīng)該記錄下過程,可以節(jié)省很多時(shí)間。
堅(jiān)持寫博客還是挺困難的,后面有時(shí)間打算再寫分析下Hessian的源碼以及C++版的Hessain,以及做其他項(xiàng)目涉及到的一些東西。
Blog:
- rebootcat.com (默認(rèn))
總結(jié)
以上是生活随笔為你收集整理的Hessian通信案例(java)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 体验Remix——安卓电脑
- 下一篇: Hessian源码分析(java)