一、总述
在Hessian学习笔记之上传文件这一篇中,通过一个实例讲解了如何通过Hessian实现上传文件。Hessian最主要的特征之一就是远程过程调用(Remote Procedure Call,RPC)。下面通过一个简单的实例说明。
二、实例展示
1、环境搭建
开发工具:eclipse + tomcat。
服务端:JavaWeb工程。例如,实例中本人创建的JavaDemo工程。
客户端:Java工程。例如,实例中本人创建的HessianClient工程。
2、代码实现
a.实体类:
import java.io.Serializable; import java.util.Date; public class Person implements Serializable { private static final long serialVersionUID = 8268991521882061845L; private int id; private String name ; private Long phone ; private boolean gender; private double height; private float weight; private String[] address; private Date birthday; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Long getPhone() { return phone; } public void setPhone(Long phone) { this.phone = phone; } public boolean isGender() { return gender; } public void setGender(boolean gender) { this.gender = gender; } public double getHeight() { return height; } public void setHeight(double height) { this.height = height; } public float getWeight() { return weight; } public void setWeight(float weight) { this.weight = weight; } public String[] getAddress() { return address; } public void setAddress(String[] address) { this.address = address; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String toString(){ return "name:" + this.name + " phone:" + this.phone; } }
b.服务端HessianServer接口
import java.io.InputStream; import java.util.List; import com.zh.hessian.entry.Person; public interface HessianServer { public String say(); public String say(String str); public List<Person> getPerson(); public Person getPersonById(int id); public boolean upload(String filename,InputStream data); public byte[] download(String filename); }
c.服务端HessianServer接口实现
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.Random; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import com.zh.hessian.entry.Person; public class HessianServerImpl implements HessianServer { //上传或下载文件的地址 private static String file_Path = "D:/tools/LearningByMyself/hessian/temp/"; private static Person[] persons = new Person[5]; static { Random random = new Random(); for(int i=0;i<persons.length;i++){ persons[i] = new Person(); persons[i].setId(i); persons[i].setGender(random.nextBoolean()); persons[i].setName("name-" + i); persons[i].setPhone(random.nextLong()); persons[i].setHeight(random.nextDouble()); persons[i].setWeight(random.nextFloat()); persons[i].setAddress(new String[]{"Address" + random.nextInt(),"Address" + random.nextInt()}); Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.DATE, i+1); persons[i].setBirthday(calendar.getTime()); } } @Override public String say() { return "Hello HessianRPC " + new Date().toString(); } @Override public String say(String str) { return "Welcome" + str; } @Override public List<Person> getPerson() { return Arrays.asList(persons); } @Override public Person getPersonById(int id) { for(Person person : persons){ if(person.getId() == id){ return person ; } } return null; } @Override public boolean upload(String filename, InputStream data) { List<String> temp; try { temp = IOUtils.readLines(data); String filePath = file_Path + filename; FileUtils.writeLines(new File(filePath), temp); System.out.println("Upload file to " + filePath); return true; } catch (IOException e) { e.printStackTrace(); return false; } } @Override public byte[] download(String filename) { String filePath = file_Path + filename; InputStream data = null; try { data = new FileInputStream(filePath); int size = data.available(); byte[] buffer = new byte[size]; IOUtils.read(data, buffer); return buffer; } catch (FileNotFoundException e) { e.printStackTrace(); return null; } catch (IOException e) { e.printStackTrace(); return null; } finally { IOUtils.closeQuietly(data); } } }
d.web.xml配置
<servlet> <!-- RPC HessianServlet --> <servlet-name>hessianRPC</servlet-name> <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class> <!-- 服务端配置 --> <init-param> <param-name>service-class</param-name> <param-value>com.zh.hessian.server.HessianServerImpl</param-value> </init-param> <!-- 客户端配置(可选) --> <init-param> <param-name>api-class</param-name> <param-value>com.zh.hessian.server.HessianServer</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>hessianRPC</servlet-name> <url-pattern>/hessianRPC</url-pattern> </servlet-mapping>
e.检验服务端
启动Tomcat后,在浏览器中输入:http://localhost:8080/JavaDemo/hessianRPC,回车后,出现如下信息:
Hessian Requires POST
则服务端可用。
f.文件打包:
将服务端的HessianServer文件和实体类Person打成Jar包,添加到客户端的工程。例如,实例中打成的两个jar包:HessianRPC.jar和Person.jar。
g.客户端实现
import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.util.List; import org.apache.commons.io.IOUtils; import com.caucho.hessian.client.HessianProxyFactory; import com.zh.hessian.entry.Person; import com.zh.hessian.server.HessianServer; public class HessianClient { //Hessian RPC远程服务url private static final String url = "http://127.0.0.1:8080/JavaDemo/hessianRPC"; public static void main(String[] args) throws Exception{ //创建HessianProxyFactory实例 HessianProxyFactory factory = new HessianProxyFactory(); //开启方法重载 factory.setOverloadEnabled(true); //获得Hessian服务的远程引用 HessianServer hessianServer = (HessianServer)factory.create(HessianServer.class, url); //调用方法 System.out.println("call say():" + hessianServer.say()); System.out.println("call say(\"Tom\"):" + hessianServer.say("Tom")); System.out.println("call getPerson():"); //调用方法获取集合对象 List<Person> persons = hessianServer.getPerson(); if (null != persons && persons.size() > 0) { for (Person p : persons) { System.out.println(p.toString()); } } else { System.out.println("No person."); } //通过参数调用方法获取对象 int id = 2; System.out.println(String.format("call getPersonById(%d)", id)); Person person = hessianServer.getPersonById(id); if (null != person) { System.out.println(person.toString()); } else { System.out.println("Id is " + id + " person not exist."); } uploadFile(hessianServer); downloadFile(hessianServer); } /** * 上传文件 * @param hessianServer */ public static void uploadFile(HessianServer hessianServer){ String file = "D:/papers/work_opt.txt";//需要上传的文件 String file_path= "D:/tools/LearningByMyself/hessian/temp";//上传文件到服务器的路径 InputStream data = null; try { data = new BufferedInputStream(new FileInputStream(file)); if (hessianServer.upload("work_opt.txt", data)) { System.out.println("Upload file " + file_path + " succeed."); } else { System.out.println("Upload file " + file_path + " failed."); } } catch (FileNotFoundException e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(data); } } /** * 下载文件 * @param hessianServer */ public static void downloadFile(HessianServer hessianServer){ byte[] temp = null ; String file_name = "work_opt.txt" ; String download_path = "D:/tools/LearningByMyself/hessian/temp_write/";//文件下载后存放的路径 try { temp = hessianServer.download(file_name); if (null != temp) { FileWriter output = new FileWriter(download_path + file_name); IOUtils.write(temp, output, "UTF-8"); System.out.println("Download file " + download_path + " succeed."); output.close(); } else { System.out.println("Download file " + download_path + " failed."); } } catch (IOException e) { e.printStackTrace(); } } }
三、测试结果
call say():Hello HessianRPC Wed Jul 15 10:50:09 CST 2015
call say("Tom"):WelcomeTom
call getPerson():
name:name-0 phone:838556501517807978
name:name-1 phone:284031862309934267
name:name-2 phone:-1412022783575136070
name:name-3 phone:-6202617782412451628
name:name-4 phone:6912293883557709050
call getPersonById(2)
name:name-2 phone:-1412022783575136070
Upload file D:/tools/LearningByMyself/hessian/temp succeed.
Download file D:/tools/LearningByMyself/hessian/temp_write/ succeed.
最后在对应的路径下找到上传和下载的文件。例如,实例中的work_opt.txt文件,上传文件:D:\tools\LearningByMyself\hessian\temp,下载文件:D:\tools\LearningByMyself\hessian\temp_write。
相关推荐
mxd文件免费下载 压缩
chromedriver-win64-136.0.7073.0.zip
weixin052用于日语词汇学习的微信小程序+ssm(文档+源码)_kaic
https://blog.csdn.net/u011561335/article/details/146312652
国产系统UOS系统,华为鲲鹏处理器 ARM架构,Qt5.15.2编译输出的包。设置环境变量后可用。博客地址:https://luoyayun361.blog.csdn.net/article/details/118395262
基于雨流计数法的源荷储双层协同优化配置策略及经济性评估研究,基于雨流计数法的源荷储双层协同优化配置及容量寿命评估方法研究,西门子S7-200PLC和MCGS火电厂烟气监测控制系统 ,西门子S7-200PLC; MCGS火电厂烟气监测; 控制系统; 烟气监测。,西门子S7-200PLC与MCGS在火电厂烟气监测控制中的应用系统
西门子S71511 PLC PID程序控制阀门开度,模拟量转换,博途WinCC画面完整案例分享,西门子S71511PLC PID程序控阀门开度:模拟量转换,博途wincc画面实例与程序详解,锂离子电池SOH估计,根据循环中的规律,提取每个循环中的的电压和电流各10个健康因子,设计的基础模型结构为输入层+LSTM层+全连接层+输出层。 ,锂离子电池SOH估计; 循环规律; 电压健康因子; 电流健康因子; 基础模型结构:输入层+LSTM层+全连接层+输出层,锂离子电池SOH预测模型:基于LSTM和电压电流健康因子
大学生创业项目源码
SAP SD-Class 8 Credit Memo & Debit Memo.mp4
2023-04-06-项目笔记-第四百四十阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的作用域 4.4.2.1全局变量的作用域_1 4.4.2.438局变量的作用域_438- 2025-03-17
质子交换膜燃料电池Simulink模型:涵盖静态与动态特性,全面计算输出性能与效率,附参考公式与文献指南,基于Simulink的质子交换膜燃料电池模型:静态和动态模拟,计算输出和效率,锂离子电池仿真,COMSOL仿真,锂电池仿真 ,锂离子电池仿真; COMSOL仿真; 锂电池仿真,锂离子电池COMSOL仿真技术研究
近年来,信息化管理行业的不断兴起,使得人们的日常生活越来越离不开计算机和互联网技术。首先,根据收集到的用户需求分析,对设计系统有一个初步的认识与了解,确定疫情信息管理系统的总体功能模块。然后,详细设计系统的主要功能模块,通过数据库设计过程将相关的数据信息存储到数据库中,再通过使用关键的开发工具,如IDEA开发平台、AJAX技术等,编码设计相关的功能模块。接着,主要采用功能测试的方式对系统进行测试,找出系统在运行过程中存在的问题,以及解决问题的方法,不断地改进和完善系统的设计。最后,总结本文介绍的系统的设计和实现过程,并且针对于系统的开发提出未来的展望工作。本系统的研发具有重大的意义,在安全性方面,用户使用浏览器访问网站时,采用注册和密码等相关的保护措施,提高系统的可靠性,维护用户的个人信息和财产的安全。在方便性方面,促进了疫情信息管理系统的信息化建设,极大的方便了相关的工作人员对疫情信息管理系统信息进行管理。 关键词:疫情信息管理系统管理;Java语言;B/S模式;AJAX技术;系统测试
内容概要:论文提出了一种全新的动态综合评价方法,该方法综合考虑了评价指标的时间发展趋势、指标权重及时间权重,解决了以往方法未能考量的趋势变化问题。通过定义“发展因子”来衡量被评价对象在特定时间内指标的发展情况,从而调整评估分数,并使用离差平方和最小化的算法获得权重。此外,该研究还提出了一种“厚今薄古”的时间加权方法,赋予近期数据更高权重。为了验证新模型的有效性和实用性,文中以中国西部地区的省份为样本进行了宏观经济评价实验。 适合人群:从事评价理论与方法研究的专业学者和技术工作者、研究生及以上学历的研究员。 使用场景及目标:该方法适用于各类涉及长时间维度的宏观经济发展评估场景。其核心目的是揭示区域内不同省市的发展潜力及其变动趋势,帮助政策制定者做出更为精准的战略布局和资源配置决策。 其他说明:论文强调此模型不仅可以区分短期表现差异,还能捕捉长期发展轨迹中的细微区别,增强了对被评对象未来发展预期的理解能力。同时指出模型在未来还可以进一步优化扩展以适应更多样的应用场景。
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。
简要分析NLMSG-NOOP参数
传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,居民信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广大用户的需求,因此就应运而生出相应的中山社区医疗综合服务平台。 本中山社区医疗综合服务平台分为管理员还有用户两个权限,管理员可以管理用户的基本信息内容,可以管理药物信息以及药物的租赁信息,能够与用户进行相互交流等操作,用户可以查看居民信息,可以查看药物以及查看管理员回复信息等操作。 该中山社区医疗综合服务平台采用的是WEB应用程序开发中最受欢迎的B/S三层结构模式,使用占用空间小但功能齐全的MySQL数据库进行数据的存储操作,系统开发技术使用到了JSP技术。该中山社区医疗综合服务平台能够解决许多传统手工操作的难题,比如数据查询耽误时间长,数据管理步骤繁琐等问题。总的来说,中山社区医疗综合服务平台性能稳定,功能较全,投入运行使用性价比很高。 关键词:中山社区医疗综合服务平台;MySQL数据库;SSM技术
1、文件内容:open-vm-tools-11.0.5-3.el7_9.9.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf open-vm-tools-11.0.5-3.el7_9.9.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊
最火的知识付费系统小程序PCH5三端数据互通支持采集资源开源版
阻抗等效法的配电网潮流计算分析