资源如何避免多线程下载

资源如何避免多线程下载

今天在一次会议中,有朋友问我,如何避免资源被迅雷等工具多线程下载?

确实,一些中小企业站点,尤其是个人站点,由于没有过多资金,服务器承受不了大的压力,站点提供的资源,一旦被迅雷等多线程工具下载,
对服务器的压力还是蛮客观的。

那么有什么办法避免多线程下载呢?其实最简单的办法,就是服务端根本就不要提供Content-Length值。试想一下,如果多线程下载工具得不到文件总大小值,如何分配去分配每个线程需要下载的量呢?不得已,只能通过单线程下载了。

以http下载为例,我写了一个提供下载的servlet,由于不返回Content-Length值(只返回了 ContentType值),这个serlvet返回的流,只能单线程下载。
public   class  Download  extends  HttpServlet {

    
private   static   final   long    serialVersionUID  =   8401962046132204450L ;

    
private   static   final  String FILE_PATH         =   " /home/jones/tmp/sample.zip " ;

    @Override
    
protected   void  service(HttpServletRequest req, HttpServletResponse resp)  throws  ServletException, IOException {
        resp.setContentType(
" application/octet-stream " );

        OutputStream out 
=  resp.getOutputStream();

        FileInputStream in 
=   new  FileInputStream(FILE_PATH);
        
int  readLength  =   0 ;
        
byte [] cache  =   new   byte [ 1024 ];
        
while  ((readLength  =  in.read(cache))  !=   - 1 ) {
            out.write(cache, 
0 , readLength);
        }
        in.close();

        out.flush();
        out.close();
    }
}

同样的道理,只要配置服务器不要返回Content-Length值,那么就可以有效避免多线程下载了。

你可能感兴趣的:(资源如何避免多线程下载)