-1

我正在构建一个客户端,C#它与Python. 客户端使用该方法将文件发送到服务器Socket.send(),并使用线程能够使用以下方法异步发送多个文件BackgroundWorker

private void initializeSenderDaemon()
{
    senderDaemon = new BackgroundWorker 
    { 
        WorkerReportsProgress = true,
    };
    senderDaemon.DoWork += sendFile; 
}

当满足某些条件时,RunWorkerAsync()调用该方法并发送一个文件

客户端和服务器都在开始传输之前确认文件的大小

我希望能够跟踪从客户端发送了多少文件

我虽然有类似这个概念代码的东西,但我知道它不起作用

byte[] fileContents = File.ReadAllBytes(path); // original file
byte[] chunk = null; // auxiliar variable, declared outside of the loop for simplicity sake
int chunkSize = fileContents.Length / 100; //  we will asume that the file length is a multiplier of 100 for simplicity sake

for (int i = 0; i < 100; i++)
{
    chunk = new byte[chunkSize];
    Array.Copy(fileContents, i * chunkSize, chunk, i * chunkSize, chunkSize);
    // Copy(Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length); 
    s.Send(chunk);
    reportProgress(i);
}

reportProgress(100);

该代码存在明显的问题,但我编写它只是为了解释我想要做什么

¿ 如何跟踪一个特定文件已经发送到服务器的字节数?¿ 有什么方法可以在不依赖变通方法的情况下做到这一点?¿ 我应该使用套接字类中的其他方法吗?

谢谢!

4

1 回答 1

0

尝试这样的事情:

int bSent = 0;
int fileBytesRead;

FileStream fileStream = File.Open(tmpFilename, FileMode.Open, FileAccess.Read, FileShare.Read);
while ((fileBytesRead = fileStream.Read(buffer, 0, BUFFER_SIZE)) > 0)
{
    socket.Send(buffer, 0, fileBytesRead);
    bSent += fileBytesRead;

    arg.Progress = (int) (bSent*100/totalBytes);
    arg.Speed = (bSent/sw.Elapsed.TotalSeconds);
    OnProgress(arg);
}

这个答案不是一个完美的答案,它只是我工作的摘录,但会让您大致了解使用套接字发送文件的更好方法!

于 2013-03-29T15:38:11.137 回答