代码改变世界

hessian学习(传输文件)

2018-06-07 16:06  看月亮爬上来  阅读(650)  评论(0编辑  收藏  举报

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