Java 如何限制文件上传的带宽?
我正在尝试使用他们的Android移动服务将文件上载到Microsoft Azure服务器。但问题是在上传过程中,单个文件上传会占用所有可用带宽 有没有办法限制单次上传的带宽 我试过什么? Azure服务可以将文件分成块。所以我将块大小定义为50kb,每个连接的最大带宽限制为100kb/sJava 如何限制文件上传的带宽?,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
{
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?