C # передача файлов с tcpclient и сервером - PullRequest
0 голосов
/ 03 ноября 2019

Когда я отправляю файл с кодом ниже, некоторые данные (небольшой объем) отсутствуют. Размер файла не совпадает на стороне получателя. Отправка обычной строки - это нормально, поэтому здесь нет проблем с подключением. Я просто ищу минимальное улучшение, чтобы исправить проблему, я добавлю проверку ошибок и т. Д. Позже. Спасибо! Код в основном скопирован из какого-то учебника, но я не помню, какой из них ...

Клиент - это стандартный клиент .Net TcpClient класса Client.Client - это сокет

public void SendFile2(string fileName)
        {
            using (FileStream fs = File.OpenRead(fileName))
            {
                byte[] lenBytes = BitConverter.GetBytes((int)fs.Length);
                Client.Client.Send(lenBytes);

                byte[] buffer = new byte[1024];
                int bytesRead;
                fs.Position = 0;

                while ((bytesRead = fs.Read(buffer, 0, 1024)) > 0)
                    Client.Client.Send(buffer, bytesRead, SocketFlags.None);
            }
        }

        public bool ReceiveFile2(string fileName)
        {
            using (FileStream fs = File.Create(fileName))
            {
                byte[] lenBytes = new byte[4];

                if (Client.Client.Receive(lenBytes) < 4)
                    return false;

                long len = BitConverter.ToInt32(lenBytes, 0);
                byte[] buffer = new byte[1024];
                int bytesRead;

                while ((bytesRead = Client.Client.Receive(buffer)) > 0)
                    fs.Write(buffer, 0, bytesRead);

                return len == fs.Position;
            }
        }

РЕШЕНИЕ:

public void SendFile(string fileName)
    {
        using (FileStream fs = File.OpenRead(fileName))
        {
            byte[] lenBytes = BitConverter.GetBytes((int)fs.Length);
            Client.Client.Send(lenBytes);

            byte[] buffer = new byte[1024];
            int bytesRead;
            fs.Position = 0;

            while ((bytesRead = fs.Read(buffer, 0, 1024)) > 0)
                Client.Client.Send(buffer, bytesRead, SocketFlags.None);
        }
    }

    public bool ReceiveFile(string fileName)
    {
        using (FileStream fs = File.Create(fileName))
        {
            byte[] lenBytes = new byte[4];

            if (Client.Client.Receive(lenBytes) < 4)
                return false;

            long len = BitConverter.ToInt32(lenBytes, 0);
            byte[] buffer = new byte[1024];
            int bytesRead;

// Changed from here
            while (fs.Position < len)
            {
                bytesRead = Client.Client.Receive(buffer);
                fs.Write(buffer, 0, bytesRead);
            }
// To here

            return len == fs.Position;
        }
    }

1 Ответ

0 голосов
/ 03 ноября 2019

Я думаю, что эта строка может быть проблемой.

if (Client.Client.Receive(lenBytes) < 4) и while ((bytesRead = Client.Client.Receive(buffer)) > 0)

У вас есть два приема в вашем коде.

Таким образом, вы сбрасываете первые байты,Это может объяснить различия, которые вы видите в размерах файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...