hessian学习(传输文件)
hessian较早版本通过 byte[] 进行文件传输;4.0之后支持 InputStream 作为参数或返回值进行传输。
注意:hessian会读取整个文件,如果文件过大,会导致JVM内存溢出。可以通过控制上传文件的大小,设置合理的JVM参数,以及采用随机读取方式来解决。
一:创建hessian服务端:
创建一个web项目作为文件上传的服务端,命名为FileUploader,引入所需要的jar包:
1. 1、创建文件上传服务接口IFileUploadService
IFileUploadService接口代码如下:
package file.upload.service; import java.io.InputStream; public interface IFileUploadService { public void upload(String filename, InputStream data); }
1.2实现文件上传服务接口IFileUploadService
其实现类代码如下:
package file.upload.service.Impl; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import file.upload.service.IFileUploadService; public class IFileUploadServiceImpl implements IFileUploadService { @Override public void upload(String filename, InputStream data) { BufferedInputStream bis = null; BufferedOutputStream bos = null; try { //获取客户端传递的InputStream bis = new BufferedInputStream(data); //创建文件输出流 bos = new BufferedOutputStream(new FileOutputStream("E:/"+filename)); byte[] buffer = new byte[8192]; int r; try { r = bis.read(buffer, 0, buffer.length); while(r>0){ bos.write(buffer, 0, r); r = bis.read(buffer, 0, buffer.length); } System.out.println("-------文件上传成功!-------------"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block throw new RuntimeException(e); } finally{ if (bos != null) { try { bos.close(); } catch (IOException e) { throw new RuntimeException(e); } } if (bis != null) { try { bis.close(); } catch (IOException e) { throw new RuntimeException(e); } } } } }
1.3在web.xml中配置HessianServlet
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>FileUploader</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>FileUploadService</servlet-name> <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class> <init-param> <param-name>service-class</param-name> <!-- 服务器对接口的实现,供客户端调用 --> <param-value>file.upload.service.Impl.IFileUploadServiceImpl</param-value> </init-param> <init-param> <!--提供给客户端调用的接口,这里的home-api配置不是必须的,可以不配置--> <!--home-api也可以写为api-class --> <param-name>home-api</param-name> <!-- 客户端接口 --> <param-value>file.upload.service.IFileUploadService</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>FileUploadService</servlet-name> <url-pattern>/FileUploadService</url-pattern> </servlet-mapping> </web-app>
到此,服务端的编写就完成了,部署FileUploader到Tomcat服务器,启动Tomcat服务器,在浏览器地址栏输入:http://localhost:8080/FileUploader/FileUploadService,查看是否可以调用。
出现此结果,说明hessian服务器测试通过
二:创建文件上传客户端
创建一个普通的java项目作为文件上传客户端,添加对hessian-4.0.51.jar的引用,同时将Hessian服务端的FileUploadServiceI接口打包成jar包提供给文件上传客户端调用,如下图所示:
2.1、编写文件上传客户端
FileUploaderClient类的代码如下:
package file.uplaod.client; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.InputStream; import java.net.MalformedURLException; import com.caucho.hessian.client.HessianProxyFactory; import file.upload.service.IFileUploadService; public class FileUploaderClient { //Hessian服务的url public static final String url="http://localhost:8088/FileUploader/FileUploadService"; public static void main(String[] args) throws Exception { //创建HessianProxyFactory实例 HessianProxyFactory factory = new HessianProxyFactory(); //获得Hessian服务的远程引用(调用server) IFileUploadService uploader = (IFileUploadService) factory.create(IFileUploadService.class, url); //读取需要上传的文件 InputStream data = new BufferedInputStream(new FileInputStream("E:/QQ下载文档/论文/Spring实战第4版.pdf")); //调用远程服务上传文件。 uploader.upload("Spring实战第4版.pdf", data); } }
编译运行服务端与客户端:
最后结果:
原文参考:http://www.cnblogs.com/xdp-gacl/p/3898100.html