1. 程式人生 > >淺析利用Hessian跨Web網站發送數據包

淺析利用Hessian跨Web網站發送數據包

public oca () getname string value 完全 時間 factory

筆者,不玩遊戲已經有一個月的時間了。昨天偶然發現大家都在玩吃雞,於是好奇心作祟,昨個不知不覺就到了5點多。筆者現在的電腦配置是10年前的,現在最大的期待是能夠有一臺配置高、外觀漂亮的電腦。好了,每天閑扯一下其實很開心,也主要是現在的遊戲大都是3D體驗感的,筆者暈3D渲染(配置低的電腦更明顯),沒辦法啊。好了廢話不多說了,現在我們實現一種跨Web網站的數據推送技術:從當前的Web網站生成一個數據文件包,然後將該數據文件包推送到另一個Web網站中,實現網站展現效果的實時推送。對此,筆者嘗試使用Hessian解決跨Web服務進行服務器間的數據推送。
總結一下hessian:
1、 相比WebService,Hessian更簡單、快捷。
2、采用的是二進制RPC協議
RPC是指遠程過程調用協議,因為采用的是二進制協議,所以它很適合於發送二進制數據。
3、對象必須進行序列化
由於使用二進制RPC協議傳輸數據,對象必須進行序列化,實現Serializable 接口
4、通過 Hessian 本身提供的 API 來發起請求。
5 、Hessian 通過其自定義的串行化機制將請求信息進行序列化,產生二進制流。
6、Hessian 基於 Http 協議進行傳輸。
7、響應端根據 Hessian 提供的 API 來接收請求。
8、Hessian 根據其私有的串行化機制來將請求信息進行反序列化,傳遞給使用者時已是相應的請求信息對象了。
9 、處理完畢後直接返回, hessian 將結果對象進行序列化,傳輸至調用端。
調用端通過 HessianProxyFactory 的 create 方法就是創建接口的代理類,該類實現了接口, JDK 的 proxy 類會自動用 InvocationHandler 的實現類(該類在 Hessian 中表現為 HessianProxy )的 invoke 方法體來填充所生成代理類的方法體。
Hessian 的這個遠程過程調用,完全使用動態代理來實現的。
除去 spring 對其的封裝,調用端主要是通過 HessianProxyFactory 的 create 方法就是創建接口的代理類,該類實現了接口, JDK 的 proxy 類會自動用 InvocationHandler 的實現類(該類在 Hessian 中表現為 HessianProxy )的 invoke 方法體來填充所生成代理類的方法體。
調用端系統啟動時:
根據 serviceUrl 和 serviceInterface 創建代理。
HessianProxyFactoryBean 類
HessianClientInterceptor 類
createHessianProxy(HessianProxyFactory proxyFactory)
HessianProxyFactory 類
public Object create(Class api, String urlName)
調用端調用 hessian 服務時:
HessianProxy 類的 invoke(Object proxy, Method method, Object []args) 方法
String methodName = method.getName();// 取得方法名
Object value = args[0]; // 取得傳入參數
conn = sendRequest(mangleName, args) ; // 通過該方法和服務器端取得連接
httpConn = (HttpURLConnection) conn;
code = httpConn.getResponseCode(); // 發出請求
// 等待被調用端返回相應…………
is = conn.getInputStream();
Object value = in.readObject(method.getReturnType()); // 取得返回值
HessianProxy 類的 URLConnection sendRequest(String methodName, Object []args) 方法:
URLConnection conn = _factory.openConnection(_url); // 創建 URLConnection
OutputStream os = conn.getOutputStream();
AbstractHessianOutput out = _factory.getHessianOutput(os); // 封裝為 hessian 自己的輸入輸出 API
out.call(methodName, args);
return conn;
被調用端接收請求並處理請求
被調用端截獲相應請求交給:
org.springframework.remoting.caucho.HessianServiceExporter
具體處理步驟如下:
a) HessianServiceExporter 類
(HessianExporter) invoke(request.getInputStream(), response.getOutputStream());
b) HessianExporter 類
(Hessian2SkeletonInvoker) this.skeletonInvoker.invoke(inputStream, outputStream);
c) Hessian2SkeletonInvoker 類
將輸入輸出封轉化為轉化為 Hessian 特有的 Hessian2Input 和 Hessian2Output
Hessian2Input in = new Hessian2Input(isToUse);
in.setSerializerFactory(this.serializerFactory);
AbstractHessianOutput out = null;
int major = in.read();
int minor = in.read();
out = new Hessian2Output(osToUse);
out = new HessianOutput(osToUse);
out.setSerializerFactory(this.serializerFactory);
(HessianSkeleton) this.skeleton.invoke(in, out);
d) HessianSkeleton 類
讀取方法名
String methodName = in.readMethod();
Method method = getMethod(methodName);
讀取方法參數
Class []args = method.getParameterTypes();
Object []values = new Object[args.length];
執行相應方法並取得結果
result = method.invoke(service, values);
結果寫入到輸出流
out.writeObject(result);
總結: 由上面源碼分析可知,被調用端接收處理請求都是通過 hessian 自己的 API 。輸入輸出流都要封裝為 hessian 自己的 Hessian2Input 和 Hessian2Output
筆者一直堅信,簡單代碼叠代出復雜功能。
下篇繼續,實地過程中的hessian,跨Web服務的數據推送。
參考資料《Hessian百度百科》

淺析利用Hessian跨Web網站發送數據包