hessian源碼相對(duì)于spring操作事例演示
《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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 市教育局冬季運(yùn)動(dòng)會(huì)安全工作預(yù)案
- 2024年秋季《思想道德與法治》大作業(yè)及答案3套試卷
- 2024年教師年度考核表個(gè)人工作總結(jié)(可編輯)
- 2024年xx村兩委涉案資金退還保證書
- 2024年憲法宣傳周活動(dòng)總結(jié)+在機(jī)關(guān)“弘揚(yáng)憲法精神推動(dòng)發(fā)改工作高質(zhì)量發(fā)展”專題宣講報(bào)告會(huì)上的講話
- 2024年XX村合作社年報(bào)總結(jié)
- 2024-2025年秋季第一學(xué)期初中歷史上冊(cè)教研組工作總結(jié)
- 2024年小學(xué)高級(jí)教師年終工作總結(jié)匯報(bào)
- 2024-2025年秋季第一學(xué)期初中物理上冊(cè)教研組工作總結(jié)
- 2024年xx鎮(zhèn)交通年度總結(jié)
- 2024-2025年秋季第一學(xué)期小學(xué)語(yǔ)文教師工作總結(jié)
- 2024年XX村陳規(guī)陋習(xí)整治報(bào)告
- 2025年學(xué)校元旦迎新盛典活動(dòng)策劃方案
- 2024年學(xué)校周邊安全隱患自查報(bào)告
- 2024年XX鎮(zhèn)農(nóng)村規(guī)劃管控述職報(bào)告