基于hessian的文件传输 (转)

基于hessian的文件传输html

一般文件传输建议仍是经过 ftp ,只有当 ftp 知足不了需求时,才考虑 hessian 的传输方案。java

Hessian 传文件的应用场景有好比两台须要传输文件的服务器之间的网络状况限制比较严格,不容许 ftp 或新开端口之类;两台服务器之间传文件必须通过一台中间机器中转。还有就是得到比 ftp 传输更大的灵活性。上面的一些应用场景,都是在项目里实际遇到的。服务器

Hessian 是不支持 File 的直接传输的,因此采起的方案是将 File 读到 byte[] 再用 hessian 传输。
  
不过最新的
 hessian4.0 已经支持 InputStream 做为参数或返回值进行传输。网络

说明: http://www.blogjava.net/Images/OutliningIndicators/None.gif    public  String uploadStream(String filename, InputStream data)
说明: http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif    
 {
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif        HessianInerface hessianInerface 
 =  (HessianInerface) getHessianInterface();
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif        
 return  hessianInerface.uploadStream(filename, data);
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif
说明: http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif    }
jvm


可是以上2中方法都会有个问题,就是当文件比较大的时候,会报java.lang.OutOfMemoryErrorui

基于 byte[] 的方法的解决办法是将大的文件分红一小块一小块进行传输。url

说明: http://www.blogjava.net/Images/OutliningIndicators/None.gif   public  String uploadSingleFiles(File file)
说明: http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif    
 {
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif        String logicPath 
 =   "" ;
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif        InputStream is 
 =   null ;
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif        
 try 
说明: http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif         
 {
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif            
 byte [] buffer  =   null ;
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif            HessianInerface hessianInerface 
 =  (HessianInerface) getHessianInterface();
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif            is 
 =   new  FileInputStream(file);
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif            
 long  size  =  file.length();
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif            
 long  perSize  =  onePerSize;
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif            
 if  (size  >  onePerSize)
说明: http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif            
 {
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif                
 long  index  =  size  /  perSize;
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif                
 if  (size  >  perSize  *  index)
说明: http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif                
 {
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif                    index 
 =  index  +   1 ;
说明: http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif                }
 
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif 
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif                
 for  ( long  j  =   1 ; j  <=  index; j ++ )
说明: http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif                
 {
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif                    
 long  curPerSize  =  perSize;
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif                    
 if  (j  ==  index)
说明: http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif                    
 {
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif                        curPerSize 
 =  size  -  perSize  *  (j  -   1 );
说明: http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif                    }
 
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif 
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif                    buffer 
 =   new   byte [( int ) curPerSize];
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif                    is.read(buffer);
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif                    
 if  (j  ==   1 )
说明: http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif                    
 {
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif                        logicPath 
 =  hessianInerface.uploadSingleBigFile(buffer,
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif                                file.getName(), 
 false );
说明: http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif                    }
   else 
说明: http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif                     
 {
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif                        logicPath 
 =  hessianInerface.uploadSingleBigFile(buffer,
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif                                file.getName(), 
 true );
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif
说明: http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif                    }
 
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif 
说明: http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif                }
 
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif 
说明: http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif            }
   else 
说明: http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif             
 {
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif                buffer 
 =   new   byte [is.available()];
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif                is.read(buffer);
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif                logicPath 
 =  hessianInerface.uploadSingleFile(buffer, file
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif                        .getName());
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif
说明: http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif            }
 
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif 
说明: http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif        }
   catch  (IOException e)
说明: http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif        
 {
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif            
 throw   new  RuntimeException(e);
说明: http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif        }
   finally 
说明: http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif         
 {
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif            IOUtils.closeQuietly(is);
说明: http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif        }
 
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif 
说明: http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif        
 return  logicPath;
说明: http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif    }
 
说明: http://www.blogjava.net/Images/OutliningIndicators/None.gif
spa



基于 InputStream 的解决办法,最初想法讲 InputStream 分块读出传输,不过没成功,若是谁成功,请告诉我一声。.net

总结,若是 jvm 的内存设置比较大, InputStream 的方式是能够直接传输的,而 byte[] 的方式超过必定的大小就报错,在个人机器上大概 20M 左右。因此基于 byte[] 的分块传输是目前比较合理的解决办法。htm

代码比较多,我就不一一帖出了,在最后放出下载的连接,在服务端的实现类请根据本身的需求稍微修改下就能运行起来。

使用方法示例以下 :

说明: http://www.blogjava.net/Images/OutliningIndicators/None.gif HessianClient cl  =   new  HessianClient();
说明: http://www.blogjava.net/Images/OutliningIndicators/None.gif
说明: http://www.blogjava.net/Images/OutliningIndicators/None.gif cl.setHessianserviceurl(
 http://127.0.0.1:80/hessianService );
说明: http://www.blogjava.net/Images/OutliningIndicators/None.gif
说明: http://www.blogjava.net/Images/OutliningIndicators/None.gif 
说明: http://www.blogjava.net/Images/OutliningIndicators/None.gif
说明: http://www.blogjava.net/Images/OutliningIndicators/None.gif            
 long  onePerSize  =   2080000 ;
说明: http://www.blogjava.net/Images/OutliningIndicators/None.gif
说明: http://www.blogjava.net/Images/OutliningIndicators/None.gif          cl.setOnePerSize(onePerSize);
说明: http://www.blogjava.net/Images/OutliningIndicators/None.gif
说明: http://www.blogjava.net/Images/OutliningIndicators/None.gif         File file1 
 =   new  File( " d:\\tddownload\\CJT.rar " );
说明: http://www.blogjava.net/Images/OutliningIndicators/None.gif
说明: http://www.blogjava.net/Images/OutliningIndicators/None.gif        cl.uploadSingleFiles(file1)  ;
说明: http://www.blogjava.net/Images/OutliningIndicators/None.gif
说明: http://www.blogjava.net/Images/OutliningIndicators/None.gif 
说明: http://www.blogjava.net/Images/OutliningIndicators/None.gif
说明: http://www.blogjava.net/Images/OutliningIndicators/None.gif        File ff
 =    cl.downloadSingleBigFile( 23884L , " 中文9999.rar " )  ;
说明: http://www.blogjava.net/Images/OutliningIndicators/None.gif
说明: http://www.blogjava.net/Images/OutliningIndicators/None.gif

 

代码还能够继续完善的地方,好比加入文件的完整性校验,压缩传输等。
代码下载地址:
http://www.blogjava.net/Files/magicdoom/hessianTransferFile.rar

相关文章
相关标签/搜索