zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    【2017-5-24】WebForm 条件查询
    【2017-5-24】WebForm 分页功能
    【2017-5-22】Application ViewState RepeaterCommand用法
    【2017-5-21】问题总结 Session,Cookie,登录状态保持
    【2017-5-20】传值基础 复合控件
    【2017-5-18】WebForm Repeater的使用 简单控件
    JavaScript Bind()趣味解答 包懂~~
    无题
    移动端横屏(beta)
    常用CSS居中
  • 原文地址:https://www.cnblogs.com/1987721594zy/p/9151165.html
Copyright © 2011-2022 走看看