0

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

4

1 回答 1

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();
于 2013-06-03T11:36:50.423 回答