我尝试创建一个可以从服务器下载文件的应用程序,以测量我可以使用特定服务器获得的速度。我通过使用 Asynctask 类来做到这一点。我要下载的所有文件都位于同一目录中。我的问题是,如何通过保持连接而不是每次创建新文件来下载后续文件?我知道对于 TCP 连接,在下载文件之前必须建立 3 次握手。我想连接到服务器,然后保持连接并执行下载。
我的代码看起来像这样
@Override
protected Integer doInBackground(String... sUrl) {
try {
speed=0; //initial value
int i=0;
while ((i<sUrl.length)) {
URL url = new URL(sUrl[i]); //sUrl[] contains the links that i want
// for example http://myserver.net/file1.jpg, http://myserver.net/file2.jpg ... etc
URLConnection connection = url.openConnection();
connection.connect(); //connection to be established 3WAY HANDSHAKE
int fileLength = connection.getContentLength();
// download the file
InputStream input = new BufferedInputStream(url.openStream());
OutputStream output = new FileOutputStream(file);
byte data[] = new byte[1024];
long total = 0;
int count;
long start = System.currentTimeMillis();
while ((count = input.read(data)) != -1) {
total += count;
publishProgress((int) (total * 100 / fileLength));
output.write(data, 0, count);
}
long finish = System.currentTimeMillis();
long tempSpeed= (fileLength *8)/(finish-start);
if (tempSpeed>speed) {
speed=tempSpeed;
}
output.flush();
output.close();
input.close(); // connection is closed
i++;
}
}catch(Exception e) {
exceptions.add(e);
}
return 1;
}
由于 3way handsharke ,通过创建新连接,我失去了时间(下载速度)。此外,在 TCP 中传输文件时,有一个称为 tcp 窗口的东西(当您下载数据时,最初您会以低速传输开始,如果连接良好,则此速率会增加)。如何在不为每个文件创建和拆除连接的情况下执行上述操作?