通过一次TCP握手从一台服务器下载多个后续文件

时间:2013-06-03 10:57:39

标签: android tcp download android-asynctask

我尝试创建一个可以从服务器下载文件的应用程序,以衡量我可以通过特定服务器获得的速度。我通过使用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窗口的内容(当您下载数据时,首先从低速传输开始,如果连接良好,则此速率会增加)。 如何在不创建和拆除每个文件的连接的情况下执行上述操作?

1 个答案:

答案 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();