0

我正在尝试将一些字节上传到服务器 15 秒。我编写了以下代码将字节写入输出流:

        long uploadedBytes=0;
        ByteArrayInputStream byteArrayInputStream=null;
        OutputStream outputStream=null;
        try {
            byte[] randomData=generateBinData(5*1024);
            byte[] bytes = new byte[(int) 1024 * 5];
            URL url = new URL(urls[0]);
            HttpURLConnection connection = 
                    (HttpURLConnection) url.openConnection();
            connection.setDoOutput(true);
            connection.setUseCaches(false);
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Connection", "Keep-Alive");
            outputStream = connection.getOutputStream();

            byteArrayInputStream = new ByteArrayInputStream(randomData);
            long startTime=System.currentTimeMillis();
            while(byteArrayInputStream.read(bytes) > 0 
                    && timeDiff < 15000) {
                outputStream.write(bytes, 0, bytes.length);
                uploadedBytes += bytes.length;
                byteArrayInputStream = new ByteArrayInputStream(randomData);
                timeDiff = System.currentTimeMillis() - startTime;
                int progress=(int)(timeDiff *100 / 15000);
                publishProgress(progress);
            }

但是上面的上传进度非常快,几秒钟内就显示出大量的字节上传。这不是根据我的 2g 移动网络连接。例如它显示:uploadedBytes = 9850880 和时间差(timeDiff)= 3 秒。

如果我运行相同的代码 15 秒,它会终止整个应用程序。请帮我找出我哪里出错了。谢谢……等待回复

4

2 回答 2

0

检查您的随机字节长度。我认为 generateBinData() 方法没有生成 5Kb 的数据。

确定uploadBytes 是巨大的。比如说,如果写入输出流需要 10 毫秒来写入 5Kb(5*1024) 的数据,那么在 3 秒内你应该只能写入 153600 字节。

应用程序终止的原因 - 检查是否有任何读取操作引发异常。

于 2013-06-05T14:54:12.523 回答
0

除非您设置分块或流传输模式,否则HttpURLConnection在发送任何输出之前缓冲所有输出,因此它可以获得 Content-Length。因此,您看到的是缓冲的进度,而不是传输的进度。设置分块传输模式,你会看到不同。

你的复制循环是错误的。它应该是这样的:

while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
}

您的代码可能会在这种特定情况下工作,但这并不是不适合所有情况的理由。

于 2013-06-05T23:46:46.047 回答