`
jacky-zhang
  • 浏览: 315665 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

限制上传和下载

阅读更多
不多说了,自己看吧
public class FlowControlInputStream extends FilterInputStream{    
    private long timestamp;
    private int maxbps;
    private int currentbps;
    private int bytesread;
    
    //----------------------------------------------------------
    //constructor
    public FlowControlInputStream(InputStream in, int maxbps){
        super(in);
        this.maxbps = maxbps;
        this.currentbps = 0;        
        this.bytesread = 0;
        this.timestamp = System.currentTimeMillis();
    }
    
    //----------------------------------------------------------
    //decorated methods
    
    public int read() throws IOException{
        synchronized(in){
            int avaliable = check();
            if(avaliable == 0){
                waitForAvailable();
                avaliable = check();
            }
            int value = in.read();
            update(1);
            return value;
        }
    }
 
    public int read(byte[] b) throws IOException{
        return read(b, 0, b.length);
       
    }
 
    public int read(byte[] b, int off, int len) throws IOException{
        synchronized(in){
            int avaliable = check();
            if(avaliable == 0){
                waitForAvailable();                        
                avaliable = check();
            }        
            int n = in.read(b, off, Math.min(len, avaliable));
            update(n);
            return n;   
        } 
    }
 
    private int check(){
        long now = System.currentTimeMillis();
        if(now - timestamp >= 1000){
            timestamp = now;
            currentbps = bytesread;
            bytesread = 0;
            return maxbps;
        }else{
            return maxbps - bytesread;
        }
    }
 
    private void waitForAvailable(){
        long time = System.currentTimeMillis() - timestamp;
        boolean isInterrupted = false;
        while(time < 1000){
            try{
                Thread.sleep(1000 - time);
            }catch(InterruptedException e){
                isInterrupted = true;
            }
            time = System.currentTimeMillis() - timestamp;
        }
        if(isInterrupted)
            Thread.currentThread().interrupt();
        return;
        
    }
 
    private void update(int n){
        bytesread += n;
    }
    
    public int getCurrentbps(){
        return currentbps;
    }
}

public class FlowControlOutputStream extends FilterOutputStream {
    private long timestamp;
    private int maxbps;
    private int currentbps;
    private int byteswrite;

	public FlowControlOutputStream(OutputStream out, int maxbps) {
		super(out);
        this.maxbps = maxbps;
        this.currentbps = 0;
        this.byteswrite = 0;
        this.timestamp = System.currentTimeMillis();
	}
	
	public void setMaxbps(int maxbps){
		this.maxbps = maxbps;
	}
	
	@Override
	public void write(int oneByte) throws IOException {
        synchronized(out){
            int avaliable = check();
            if(avaliable <= 0){
                waitForAvailable();
            }
            out.write(oneByte);
            update(1);
        }
	}

	@Override
	public void write(byte[] buffer) throws IOException {
		write(buffer, 0, buffer.length);
	}

	@Override
	public void write(byte[] buffer, int offset, int length) throws IOException {
		 synchronized(out){
	            int avaliable = check();
	            if(avaliable <= 0){
	                waitForAvailable();
	            }
	            out.write(buffer, offset, length);
	            update(length);
		 }
	}

    private int check(){
        long now = System.currentTimeMillis();
        if(now - timestamp >= 1000){
            timestamp = now;
            currentbps = byteswrite;
            byteswrite = 0;
            return maxbps;
        }else{
            return maxbps - byteswrite;
        }
    }
 
    private void waitForAvailable(){
        long time = System.currentTimeMillis() - timestamp;
        boolean isInterrupted = false;
        while(time < 1000){
            try{
                Thread.sleep(1000 - time);
            }catch(InterruptedException e){
                isInterrupted = true;
            }
            time = System.currentTimeMillis() - timestamp;
        }
        if(isInterrupted)
            Thread.currentThread().interrupt();
        return;
        
    }
 
    private void update(int n){
        byteswrite += n;
    }
    
    public int getCurrentbps(){
        return currentbps;
    }
}
分享到:
评论

相关推荐

    TC+IPTables实现下载和上传带宽限制脚本

    ### TC+IPTables 实现下载和上传带宽限制脚本详解 #### 一、概述 在 Linux 系统中,网络流量控制是一项重要的系统管理任务。通过对带宽进行合理分配和限制,可以有效地提高网络资源的利用率,保障关键业务的服务...

    文件上传和下载包

    - **文件大小限制**:防止过大文件导致服务器资源耗尽,可以通过配置限制上传和下载文件的大小。 - **文件名安全**:避免用户上传具有特殊路径的文件名,可能导致路径遍历攻击。应使用安全的文件命名策略。 - **...

    网络流量监控,可以限制上传、下载

    在标题和描述中提到的这款工具,是一款独立的网络流量监控软件,它无需安装,简化了使用步骤,提供了便捷的流量控制功能,能够限制网络的上传和下载速度,同时也具备查看当前网络连接的能力。 网络流量监控的首要...

    上传和下载系统 上传和下载系统

    10. **日志记录**:跟踪和记录每一次上传下载活动,便于故障排查和审计。 在实现这些功能时,开发者通常会使用HTTP或FTP协议,有时也会用到WebDAV等更高级的协议。服务器端可能采用如Node.js、Python Flask、Java ...

    迅雷限制上传补丁——给迅雷加把速

    1. **安全第一**:在下载和安装任何补丁前,请确保文件的安全性,避免恶意软件的侵入。 2. **兼容性问题**:不同的迅雷版本可能需要不同版本的补丁,安装前需确认补丁版本与迅雷版本相匹配。 3. **官方支持**:虽然...

    文件上传和下载文件上传和下载文件上传和下载

    文件上传和下载是Web应用程序中的核心功能之一,无论是用户向服务器提交个人资料、分享文档,还是从服务器获取资源,如软件更新、电子书籍等,都离不开这一操作。在这个过程中,前端与后端的交互以及数据的安全传输...

    java文件上传和下载完整demo(不限制格式)

    完整的文件上传和下载,直接拷入自己的action中即可运行,实测有效。

    tomcat上传下载文件

    以上就是关于“Tomcat上传下载文件”的知识点,包括了Struts2的文件上传处理、Servlet的文件下载实现以及相关的文件操作。在实际开发中,还需要考虑文件的安全性,例如防止上传恶意文件、限制上传文件大小、保护下载...

    JSP实现文件上传与下载.pdf

    1. 在实现JSP文件上传和下载时,需要注意文件上传的大小限制,避免上传大文件引发的服务器崩溃。 2. 在实现JSP文件上传和下载时,需要注意文件的安全性,避免恶意攻击和数据泄露。 3. 在实现JSP文件上传和下载时,...

    jsp实现上传和下载

    在提供的压缩包文件中,"down"和"load"可能是两个关键的目录或文件,它们可能分别代表了下载和上传的实现代码或者示例。通常,一个Web项目会包含Web-INF目录,其中存放web.xml配置文件,定义Servlet和JSP的映射关系...

    QQ电脑管家-随意限制上传下载速度.docx

    QQ电脑管家限制上传下载速度 QQ电脑管家是一款功能强大的电脑管理软件,今天我们将探索如何使用QQ电脑管家限制上传下载速度,避免某些软件占用带宽。 限制上传下载速度的原因 很多网友都有困惑,自己的带宽不小,...

    serv-u限制上传的文件类型

    - **允许特定类型文件上传**:紧接着创建一条新规则,例如“*.mdb”,并赋予相应的上传、下载和删除权限。 8. **测试与验证**:完成规则设置后,应该进行实际测试以确保规则生效。可以尝试上传不同类型的文件,...

    文件的上传和下载

    在实际应用中,我们还需要考虑错误处理、文件权限管理、大文件上传的分块处理、文件的预览功能、以及安全性问题,比如防止恶意文件上传、限制上传文件类型等。对于大文件上传,可以使用流式处理或分块上传,以避免一...

    上传下载一个JSP上传图片和文件实例

    综上所述,JSP实现图片和文件上传下载涉及到前端HTML表单、后端JSP或Servlet处理、文件存储管理、安全措施以及性能优化等多个环节。理解并熟练掌握这些知识点,能够帮助开发者构建稳定、安全、高效的文件上传下载...

    PHP文件上传和下载

    在PHP中,文件上传和下载是两个非常重要的功能,它们在Web开发中有着广泛的应用,例如用户上传头像、分享文件或下载资源等。本文将详细介绍如何使用PHP实现这两个功能。 首先,我们从文件上传开始。PHP提供了`$_...

    IIS6 上传文件限制

    ### IIS6 上传文件限制详解 ...需要注意的是,虽然提高了文件上传的限制,但也应考虑到服务器资源的合理分配和安全性的维护。在实际部署中,还需结合具体应用场景综合考虑各种因素,以确保系统的稳定性和安全性。

    asp.net简单网络文件夹实现上传下载(限制文件类型大小)

    在这个“asp.net简单网络文件夹实现上传下载(限制文件类型大小)”的项目中,我们将探讨如何使用ASP.NET来实现在Web应用中进行文件的上传和下载,并且添加了对文件类型和大小的限制,以增强安全性。 1. 文件上传:...

    RaySource飞速网盘客户端 v2.4.0.2 官方中文版.zip

    RaySource客户端是Rayfile网盘(飞速网网盘)专用客户端,它可以帮您:   1. 上传文件到您的网盘,可选择同一...5. 可限制上传和下载的速度; 6. 可进行语言设置,支持中英文界面切换; 7. 更方便的操作体验。

    java文件上传和下载功能

    在Java编程领域,文件上传和下载是Web应用中常见的功能,尤其在用户交互丰富的网站或系统中。本项目通过一个简单的源码实例,演示了如何实现在JSP(JavaServer Pages)界面上处理文本和图片的上传与下载,涵盖了相关...

    javaweb简单实现文件上传与下载源代码

    - **安全性**:在处理上传文件时,要防止恶意文件、超大文件或不安全文件名,需要进行大小限制、文件类型检查和重命名策略。 2. **文件下载** - **响应头设置**:为了触发浏览器的下载行为,需要在HTTP响应头中...

Global site tag (gtag.js) - Google Analytics