如何使用TCP客户端显示当前的下载/上传速度?

3

我正在创建一个文件传输应用程序,它使用TcpListenerTcpClient。我的应用程序已经完美地运作了,我只想知道如何在数据传输过程中显示下载/上传速度。我还希望应用程序显示已下载或已上传的MB数量。

服务器代码:

  IPAddress ip = IPAddress.Parse("192.168.1.2");
        int port = 9999;

        TcpListener server = new TcpListener(ip, port);
        server.Start();

        Console.WriteLine("Waiting for client...");

        TcpClient tcpClient = server.AcceptTcpClient();

        Console.WriteLine("Client connected!");

        NetworkStream networkStream = tcpClient.GetStream();
        string path = string.Empty;
        string fileName = string.Empty;

        Console.Write("File:");
        path = Console.ReadLine();

        fileName = Path.GetFileName(path);

        byte[] bytes = File.ReadAllBytes(path);

        BinaryWriter bwFileName = new BinaryWriter(networkStream);
        bwFileName.Write(fileName);

        BinaryWriter bw = new BinaryWriter(networkStream);
        bw.Write(bytes.Length);

        networkStream.Write(bytes, 0, bytes.Length);

        Console.ReadLine();

客户端代码:

IPAddress ip = IPAddress.Parse("192.168.1.2");
        int port = 9999;

        TcpClient client = new TcpClient();
        client.Connect(ip, port);

        while (true)
        {
            NetworkStream networkStream = client.GetStream();

            int byteLenght;
            string fileName = string.Empty;

            BinaryReader brFilename = new BinaryReader(networkStream);
            fileName = brFilename.ReadString();

            BinaryReader br = new BinaryReader(networkStream);
            byteLenght = br.ReadInt32();

            byte[] bytes = new byte[byteLenght];

            networkStream.Read(bytes, 0, bytes.Length);

            File.WriteAllBytes("C:\\Users\\XANDRO\\Desktop\\client\\" + fileName,bytes);
             
            break;
        }
        Console.ReadLine();
1个回答

1

一般的方法是将下载/上传拆分成块。也就是说,不要一次性写入整个字节数组,而是使用偏移量/长度参数编写块。

这样可以测量时间并在每个块后报告进度。您还可以考虑使用文件流,并从中编写/读取块。因为这将限制内存使用。

编辑:示例代码:

    public static void Copy(Stream from, Stream to, IProgress<int> progress, int bufferSize = 4096)
    {
        var bytesCopied = 0;
        var buffer = new byte[bufferSize];
        int bytesRead;
        do
        {
            bytesRead = from.Read(buffer, 0, buffer.Length);
            to.Write(buffer, 0, bytesRead);
            bytesCopied += bytesRead;
            progress.Report(bytesCopied);
        } while (bytesRead != 0);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接