Передача файлов успешна только в первый раз, часто происходит сбой - PullRequest
1 голос
/ 23 января 2012

Это программа отправки / получения файлов с использованием сокетов TCP. Этот код включен как в клиентское, так и в серверное приложение, и работает нормально только в первый раз.

Во второй раз сторона, которая собирается получить, получает 0, и перевод заканчивается. Как я могу это исправить, чтобы его можно было использовать много раз?
public static void sendFile(string filePath)
{
    FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
    string fileName = Path.GetFileName(filePath);
    byte[] fileData;
    try
    {
        //sending file name and file size to the server
        busy = true;
        fileSize = fs.Length;
        byte[] fileDetial = null;
        string detail =  fileName + "," + fileSize.ToString();
        fileDetial = Encoding.ASCII.GetBytes(detail);
        client.Send(fileDetial);

        //sending file data to the server

        fileData = new byte[packetSize];
        count = 0;
        sum = 0;
        Program.thFP.Start();                           // running transfer rate
        Program.fp.StatusLabel("Sending data...");
        transferRate.timeLeft();

        while (sum < fileSize)
        {
            fs.Seek(sum, SeekOrigin.Begin);
            fs.Read(fileData, 0, fileData.Length);
            count = client.Send(fileData, 0, fileData.Length, SocketFlags.None);
            sum += count;
            Program.fp.ProgressBarFileHandler(sum, fileSize);
        }
    }
    finally
    {
        busy = false;
        fs.Close();
        fileData = null;
        MessageBox.Show(string.Format("{0} sent successfully", fileName));
    }
}

нет проблем вообще с кодом ниже, как я предполагаю .. я думаю, что проблема в методе SENDFILE .. но вот код receiveFile .. это может помочь

public static void ReceiveFile()
{

    //receving file name and file size from server
    busy = true;
    byte[] commandData = new byte[1024];
    client.Receive(commandData);
    Console.WriteLine(Encoding.ASCII.GetString(commandData));
    string[] Command = Encoding.ASCII.GetString(commandData).Split(',');
    string fileName = Command[0];
    fileSize = Convert.ToInt64(Command[1]);
    Program.thFP.Start();                           // running transfer rate
    Program.fp.StatusLabel("Receiving data...");
    transferRate.timeLeft();

    // receiving the file data from server
    FileStream fs = new FileStream(@"D:\" + fileName, FileMode.Create, FileAccess.Write);
    byte[] fileData = new byte[packetSize];
    try
    {
        count = 0;
        sum = 0;
        while (sum < fileSize)
        {
            count = client.Receive(fileData,0,fileData.Length, SocketFlags.None);
            fs.Seek(sum, SeekOrigin.Begin);
            fs.Write(fileData, 0, fileData.Length);
            sum += count;
            Program.fp.ProgressBarFileHandler(sum,fileSize);
        }
    }
    finally
    {
        busy = false;
        fs.Close();
        fileData = null;
        MessageBox.Show(string.Format("{0} recevied successfully", fileName));
    }
}

Ответы [ 2 ]

1 голос
/ 27 января 2012

Я исправил код.Проблема была в методе SendFile и именно в FileStream

Я должен Утилизировать , чтобы я мог инициализировать его снова с новым путем

finally
{
    busy = false;
    fs.Dispose();   //here i fixed my mistake it was fs.Close()
    fileData = null;
    MessageBox.Show(string.Format("{0} sent successfully", fileName));
}
0 голосов
/ 27 января 2012

Я бы посоветовал вам избавиться от FileStream.Я рекомендую обернуть его в блок использования, чтобы он всегда был удален, даже если выброшено исключение.

// receiving the file data from server
using (FileStream fs = new FileStream(@"D:\" + fileName, FileMode.Create, FileAccess.Write))
{
    byte[] fileData = new byte[packetSize];
    try
    {
        ...same code as before here...
    }
    finally
    {
         ...same code as before here...
    }
}

Я всегда рекомендую оборачивать потоки в блок использования.Это означает, что если вы позже вернетесь и отредактируете код, то будет меньше опасности, если вы введете путь к коду, который не удаляет поток по завершении.

Я бы также реструктурировал код так, чтобы ваш "«Успешное» сообщение не находится в блоке finally - вероятно, оно должно быть в конце блока try.Ваша текущая реализация будет показывать сообщение об успехе, когда выдается исключение - и, следовательно, файл может быть успешным.

...