hessian源碼相對(duì)于spring操作事例演示

上傳人:文*** 文檔編號(hào):62240430 上傳時(shí)間:2022-03-14 格式:DOCX 頁(yè)數(shù):18 大小:446.25KB
收藏 版權(quán)申訴 舉報(bào) 下載
hessian源碼相對(duì)于spring操作事例演示_第1頁(yè)
第1頁(yè) / 共18頁(yè)
hessian源碼相對(duì)于spring操作事例演示_第2頁(yè)
第2頁(yè) / 共18頁(yè)
hessian源碼相對(duì)于spring操作事例演示_第3頁(yè)
第3頁(yè) / 共18頁(yè)

下載文檔到電腦,查找使用更方便

0 積分

下載資源

還剩頁(yè)未讀,繼續(xù)閱讀

資源描述:

《hessian源碼相對(duì)于spring操作事例演示》由會(huì)員分享,可在線閱讀,更多相關(guān)《hessian源碼相對(duì)于spring操作事例演示(18頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、文檔供參考,可復(fù)制、編制,期待您的好評(píng)與關(guān)注!   因?yàn)樽罱悬c(diǎn)時(shí)間,所以就想讀一些技術(shù)的源碼,最近選擇hessian。廢話不多說(shuō),進(jìn)入正題:   hessian客戶端時(shí)序圖: hessian服務(wù)端時(shí)序圖:   因?yàn)閔essian源碼相對(duì)于spring算很簡(jiǎn)單了。所以不浪費(fèi)大家寶貴的時(shí)間來(lái)分析源碼。想說(shuō)說(shuō)怎么實(shí)現(xiàn)遠(yuǎn)程調(diào)用(rpc)。   遠(yuǎn)程調(diào)用,顧名思義就是通過遠(yuǎn)程調(diào)用別的機(jī)器(JVM or ...)中的方法。要想實(shí)現(xiàn)遠(yuǎn)程調(diào)用,思路是怎樣呢?   常用的模式代理,工廠。為啥怎么說(shuō)呢?   遠(yuǎn)程調(diào)用通過網(wǎng)絡(luò),肯定需要工廠產(chǎn)出不同的類,不然一個(gè)類寫,會(huì)死人的。

2、   代理模式,因?yàn)檎{(diào)用前你是不知道實(shí)際的調(diào)用,肯定是通過代理調(diào)用到遠(yuǎn)程方法。   下面給大家說(shuō)說(shuō)遠(yuǎn)程調(diào)用的原理(PS:不懂代理的同學(xué),先上百度搜索:java代理)。   實(shí)現(xiàn)自定義的遠(yuǎn)程調(diào)用,就是序列化成字節(jié)流后,發(fā)送到服務(wù)端,服務(wù)端根據(jù)調(diào)用的api、方法、參數(shù)去具體調(diào)用一個(gè)方法,調(diào)用方法后把結(jié)果輸入到輸出流里面,最后結(jié)果展示在代理的return中。   ok,開始貼代碼:   客戶端(HttpRpcClient): 1 String url =?"http://localhost:8080/hessian-study-server/helloworld1"; 2 ??

3、??????HttpProxyFactory factory =?new?HttpProxyFactory(); 3 ????????Class clazz = Class.forName("com.jzx.hessian.server.SayHelloService"); 4 ????????SayHelloService sayHelloService = (SayHelloService) factory.create(clazz, url); 5 ????????System.out.println(sayHelloService.sayHello("小明

4、",?"男")); 6 ????????UserVo vo = sayHelloService.sayHello1("小明",?"男"); 7 ????????System.out.println("姓名:"?+ vo.getName() +?" 性別:"?+ vo.getSex());   從代碼中分析,首先創(chuàng)建了一個(gè)工廠類HttpProxyFactory,其次創(chuàng)建了一個(gè)類的描述。   HttpProxyFactory代碼(主要目的是得到一個(gè)代理): 1 if?(api ==?null) { 2 ????????????throw?new?NullPointe

5、rException("api must not be null for HttpProxyFactory.create()"); 3 ????????} 4 ????????InvocationHandler handler =?null; 5 ? 6 ????????handler =?new?HttpProxy(url,?this, api); 7 ? 8 ????????return?Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),?new?Cla

6、ss[] { api }, handler);   HttpProxy代理干了啥 (得到調(diào)用接口類、方法名、參數(shù)值): 1 HttpTransportation transportation =?new?HttpTransportation(); 2 ????????transportation.setClazz(api); 3 ????????transportation.setMethod(method.getName()); 4 ????????transportation.setParams(args); 5 ????????byte[] byte

7、s = ObjectUtils.objectToByte(transportation); 6 ????????Object result = sendPost(url, bytes); 7 ????????return?result;   序列化對(duì)象發(fā)送POST請(qǐng)求: 01 PrintWriter out =?null; 02 ????????BufferedReader in =?null; 03 ????????Object result =?null; 04 ????????try?{ 05 ????????????URL real

8、Url =?new?URL(url); 06 ????????????// 打開和URL之間的連接 07 ????????????URLConnection conn = realUrl.openConnection(); 08 ????????????// 設(shè)置通用的請(qǐng)求屬性 09 ????????????conn.setRequestProperty("accept",?"*/*"); 10 ????????????conn.setRequestProperty("connection",?"Keep-Alive"); 11 ????????

9、????conn.setRequestProperty("user-agent",?"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); 12 ????????????// 發(fā)送POST請(qǐng)求必須設(shè)置如下兩行 13 ????????????conn.setDoOutput(true); 14 ????????????conn.setDoInput(true); 15 ????????????// 獲取URLConnection對(duì)象對(duì)應(yīng)的輸出流 16 ????????????OutputStre

10、am outputStream = conn.getOutputStream(); 17 ????????????outputStream.write(param); 18 ????????????outputStream.close(); 19 ????????????// 定義BufferedReader輸入流來(lái)讀取URL的響應(yīng) 20 ????????????// in = new BufferedReader(new InputStreamReader(conn.getInputStream())); 21 ????????????byte[] b

11、ytes = toByteArray(conn.getInputStream()); 22 ????????????Object object = ObjectUtils.byteToObject(bytes); 23 ????????????if?(object?instanceof?String) { 24 ????????????????byte[] dest =?new?byte[bytes.length -?7]; 25 ????????????????System.arraycopy(bytes,?7, dest,?0, dest.length);

12、 26 ????????????????result =?new?String(dest,?"UTF-8"); 27 //????????????? result = new String(bytes, "UTF-8"); 28 ????????????} 29 ????????????if?(object?instanceof?UserVo) { 30 ????????????????result = object; 31 ????????????} 32 ????????}?catch?(Exception e) { 33 ??

13、??????????System.out.println("發(fā)送 POST 請(qǐng)求出現(xiàn)異常!"?+ e); 34 ????????????e.printStackTrace(); 35 ????????} 36 ????????// 使用finally塊來(lái)關(guān)閉輸出流、輸入流 37 ????????finally?{ 38 ????????????try?{ 39 ????????????????if?(out !=?null) { 40 ????????????????????out.close(); 41 ????????????

14、????} 42 ????????????????if?(in !=?null) { 43 ????????????????????in.close(); 44 ????????????????} 45 ????????????}?catch?(IOException ex) { 46 ????????????????ex.printStackTrace(); 47 ????????????} 48 ????????} 49 ????????return?result;   以上是客戶端的分割線-----------------

15、-------服務(wù)端:   配置一個(gè)sevlet,初始化配置文件: 01 @Override 02 ????public?void?init(ServletConfig config)?throws?ServletException { 03 ????????super.init(config); 04 ????????if?(getInitParameter("home-api") !=?null) { 05 ????????????String className = getInitParameter("home-api"); 06 ?????

16、???????try?{ 07 ????????????????_homeAPI = Class.forName(className); 08 ????????????}?catch?(Exception e) { 09 ? 10 ????????????} 11 ????????} 12 ????????if?(getInitParameter("service-class") !=?null) { 13 ????????????String className = getInitParameter("service-class");

17、 14 ????????????Class clazz; 15 ????????????try?{ 16 ????????????????clazz = Class.forName(className); 17 ????????????????_homeImpl = clazz.newInstance(); 18 ????????????}?catch?(Exception e) { 19 ? 20 ????????????} 21 ????????} 22 ????????httpRpcSkeleton =?new?

18、HttpRpcSkeleton(_homeAPI, _homeImpl); 23 ????} 01 @Override 02 ????public?void?service(ServletRequest request, ServletResponse response)?throws?ServletException, IOException { 03 ????????HttpServletRequest req = (HttpServletRequest) request; 04 ????????HttpServletResponse res = (

19、HttpServletResponse) response; 05 ? 06 ????????if?(!req.getMethod().equals("POST")) { 07 ????????????res.setStatus(500);?// , "Hessian Requires POST"); 08 ????????????PrintWriter out = res.getWriter(); 09 ? 10 ????????????res.setContentType("text/html"); 11 ????????????ou

20、t.println("

httrpc Requires POST

"); 12 ????????????return; 13 ????????} 14 ????????OutputStream out = res.getOutputStream(); 15 ????????try?{ 16 ????????????httpRpcSkeleton.invoke(req, out); 17 ????????}?catch?(Exception e) { 18 ????????????e.printStackTrace();

21、 19 ????????}?finally?{ 20 ????????????out.flush(); 21 ????????????out.close(); 22 ????????} 23 ????}   看到請(qǐng)求最終被HttpRpcSkeleton的invoke調(diào)用,相關(guān)代碼: 01 public?void?invoke(HttpServletRequest request, OutputStream out)?throws?Exception { 02 ????????int?len = request.getContentLength()

22、; 03 ????????ServletInputStream input = request.getInputStream(); 04 ????????byte[] buffer =?new?byte[len]; 05 ????????input.read(buffer,?0, len); 06 ????????HttpTransportation transportation = (HttpTransportation) ObjectUtils.byteToObject(buffer); 07 ????????Method method = meth

23、odMap.get(transportation.getMethod()); 08 ????????Object result = method.invoke(_homeImpl, transportation.getParams()); 09 ????????out.write(ObjectUtils.objectToByte(result)); 10 ????????// out.write(result.getBytes()); 11 ????}   以上就是實(shí)現(xiàn)遠(yuǎn)程,調(diào)用的原理。   另外對(duì)項(xiàng)目的說(shuō)明,有興趣的童鞋,可以試下不用java本身的序列化,試試protobuf。   另外有一個(gè)疑問困擾了一個(gè)晚上,當(dāng)返回為字符串的時(shí)候,ObjectInputStream會(huì)多7個(gè)字節(jié),不解,本人的java io很low,求解。   源碼為maven結(jié)構(gòu):   運(yùn)行時(shí)截圖: 18 / 18

展開閱讀全文
溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!