我尝试创建一个可以从服务器下载文件的应用程序,以衡量我可以通过特定服务器获得的速度。我通过使用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;
}
通过创建新连接,我会因为3次握手而浪费时间(下载速度)。此外,当在TCP中传输文件时,会出现一种称为tcp窗口的内容(当您下载数据时,首先从低速传输开始,如果连接良好,则此速率会增加)。 如何在不创建和拆除每个文件的连接的情况下执行上述操作?
答案 0 :(得分:0)
查看你的代码,你继续接收,直到套接字在另一边关闭,所以没有办法使用相同的套接字,因为它已关闭。
如果你可以对服务器和客户端进行编程,那么,我建议一种可行的方法,那就是使用协议,而不是直接接收文件,你得到的第一个数据包是一个整数,表示您将要接收的文件的大小。如果该长度为0(cero),则表示不再有文件,应该关闭连接。
在服务器上:
While (the_are_files_to_send)
{
Socket.write((int) FileSize);
Socket.write(file's content);
}
Socket.Write(0); // No more files;
Socket.Close();
在客户:
While ((size = Socket.read(buffer, 0, 4)) != -1)
{
int FileLength = convert_to _int(buffer);
if (FileLength==0) break;
Socket.read(FileLength bytes);
}
Socket.Close();