Java 如何限制文件上传的带宽?

Java 如何限制文件上传的带宽?,java,android,azure,azure-mobile-services,Java,Android,Azure,Azure Mobile Services,我正在尝试使用他们的Android移动服务将文件上载到Microsoft Azure服务器。但问题是在上传过程中,单个文件上传会占用所有可用带宽 有没有办法限制单次上传的带宽 我试过什么? Azure服务可以将文件分成块。所以我将块大小定义为50kb,每个连接的最大带宽限制为100kb/s { t1=geTimeInMilliseconds(); uploadChunk(); t2=geTimeInMilliseconds(); t3=t2-t1; if(t3<500m

我正在尝试使用他们的Android移动服务将文件上载到Microsoft Azure服务器。但问题是在上传过程中,单个文件上传会占用所有可用带宽

有没有办法限制单次上传的带宽

我试过什么?

Azure服务可以将文件分成块。所以我将块大小定义为50kb,每个连接的最大带宽限制为100kb/s

{
  t1=geTimeInMilliseconds();
  uploadChunk();
  t2=geTimeInMilliseconds();
  t3=t2-t1;
  if(t3<500ms){
   sleep(500-t3);
  }
}
{
t1=getimeinmillizes();
uploadChunk();
t2=getimeinmillides();
t3=t2-t1;

如果(t3从I/O流的原理出发,上传带宽限制的简单思路如下

  • 假设I/O流速度限制为
    M字节/秒
    ,则发送
    N字节
    数据的成本时间为
    N/M秒
  • 假设现在发送
    N字节
    数据,那么开销时间应该是
    N/ms
    。但是,实际开销时间是
    ts
    ,因此发送线程应该休眠
    (N/M-T)秒
    ,以实现限制速度
  • 下面是一个Java示例代码作为参考

    int BUF_SIZE = 1024;
    long speed = 12800L; // 100 Kbit/s = 100 * 1024 / 8 Byte/s = 12800 Byte/s
    File file = new File("<file path>");
    OutputStream outs = ...;
    FileInputStream fis = new FileInputStream(file);
    byte[] buf = new byte[BUF_SIZE];
    long cur = 0L;
    long startTime = System.currentTimeMillis();
    while((n = fin.read(buf)) != -1) {
        cur += n;
        out.write(buf);
        if(cur > speed) {
            long idleTime = (cur-speed)*1000/speed;
            Thread.sleep(idleTime);
            cur = 0;
            startTime = System.currentTimeMillis();
        }
    }
    fin.close();
    outs.flush();
    outs.close();
    
    int BUF_SIZE=1024;
    长速度=12800L;//100kbit/s=100*1024/8字节/s=12800字节/s
    文件文件=新文件(“”);
    输出流输出=。。。;
    FileInputStream fis=新的FileInputStream(文件);
    byte[]buf=新字节[buf_SIZE];
    长电流=0L;
    long startTime=System.currentTimeMillis();
    而((n=fin.read(buf))!=-1){
    cur+=n;
    out.write(buf);
    如果(电流>速度){
    长怠速时间=(当前速度)*1000/速度;
    睡眠(空闲时间);
    cur=0;
    startTime=System.currentTimeMillis();
    }
    }
    fin.close();
    out.flush();
    out.close();
    
    你就不能编写一个速率计算器来计算客户端的上传速率吗?@AlexSuo我只做rt?或者你的意思是必须做一些其他事情?请详细说明……谢谢……在我的解决方案中,如果我将块大小减少到一个字节,它将与你的rt相同?或者会有任何开销吗?@Praveen是的ally,但是使用磁盘和内存之类的硬件不是一个好主意。它的效率很低。只有当我发送到某个输出流时,我才能使用这种方法。在使用Azure..@Praveen等第三方api上载文件时,有没有办法做到这一点?关于使用Azure Storage SDK上载文件,我想你可以参考Azure Storage的JavaDoc例如,您可以通过类
    CloudBlockBlob
    openOutputStream
    方法使用
    bloboutpstream
    。现在尝试实现它,但有些困惑-什么是n(希望是int)、什么是temp以及在哪里使用startTime?