一、总述
? ? ? ?在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,回车后,出现如下信息:
则服务端可用。
? ? ? ? ?
? ? ? ? ?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。
原文:http://zh-workhard-java.iteye.com/blog/2227445