-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 に答える